以编程方式自动布局(NSLayoutConstraint):外部视图中的中心内部视图并约束为min(宽度,高度)

时间:2017-03-25 00:48:42

标签: swift autolayout nslayoutconstraint

我不确定使用NSLayoutConstraint生成自动布局我做错了什么。

我想使用较小的外部视图宽度和高度将内部视图放在外部视图中心。最后,我想应用缩放因子。

Auto Layout Centered

这是我的代码。

     NSLayoutConstraint.activate([
            inner.centerXAnchor.constraint(equalTo: outer.centerXAnchor),
            inner.centerYAnchor.constraint(equalTo: outer.centerYAnchor),
            inner.widthAnchor.constraint(equalTo: outer.heightAnchor, multiplier: imageScale),
            inner.widthAnchor.constraint(equalTo: outer.widthAnchor, multiplier: imageScale),
            inner.heightAnchor.constraint(equalTo: inner.widthAnchor)
    ])

这适用于:

  • width == height
  • 宽度<高度

但是当宽度>身高我明白了:

enter image description here

我错过了什么?这很容易使用框架:

let innerWidth = min(outer.frame.width, outer.frame.height) * imageScale
let innerHeight = innerWidth
inner.frame = CGRect(x: (outer.frame.width -innerWidth) / 2, 
                     y: (outer.frame.height - innerHeight) / 2,
                     width: innerWidth, height: innerHeight)

1 个答案:

答案 0 :(得分:2)

首先,您在代码中设置@model IEnumerable<Laier_It.Models.Company> @using (Html.BeginForm() ) { <p> Search By: @Html.DropDownList("SearchCategory", "") Search For: @Html.TextBox("SearchString") <input type="submit" value="Filter" /> </p> } <table class="table "> <thead> <tr> <th> @Html.ActionLink("Name", "Index", new { orderBy = ViewBag.sortByName, prev = @Model.Select(x => x.Id) } ) </th> <th> @Html.DisplayNameFor(model => model.Address) </th> <th> @Html.ActionLink("City", "Index", new { orderBy = ViewBag.sortByCity, prev = @Model.Select(x => x.Id) } ) </th> <th> @Html.ActionLink("State", "Index", new { orderBy = ViewBag.sortByState, prev = @Model.Select(x => x.Id) } ) </th> </tr> </thead> <tbody> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.Name) </td> <td> @Html.DisplayFor(modelItem => item.Address) </td> <td> @Html.DisplayFor(modelItem => item.City) </td> <td> @Html.DisplayFor(modelItem => item.State) </td> </tr> } </tbody> </table> 约束两次有点奇怪。只设置一次。

此外,您需要根据实际的外部视图框架为内部视图的尺寸选择外部锚点。如果最小外部尺寸是宽度,则将内部视图的宽度约束为inner.widthAnchor。否则,当最小外部尺寸为高度时,您约束为outer.widthAnchor * imageScale

这有助于我获得您正在寻找的布局(我刚刚创建了一个简单的单视图项目):

outer.heightAnchor * imageScale