簡體   English   中英

如何在不使布局不明確的情況下使用大於或等於對iOS AutoLayout約束進行編程?

[英]How can I program iOS AutoLayout constraints using Greater Than or Equal without making the layout ambiguous?

我正在使用MonoTouch編寫一個iOS應用程序,我想以編程方式定義我的所有UIView和定義其布局的AutoLayout約束。 我目前正在嘗試創建一個類似表的視圖集合(行和列,而不是UITableView),並且能夠使用AutoLayout約束來調整列和行的“邊界”或標記。 當我運行該應用程序時,它看起來不錯,但是我一直在為該表獲得一個模糊的布局(使用HasAmbiguousLayout字段)。 我將其簡化為以下事實:我的邊界標記使用的是GreaterThanOrEqual(GTE)約束而不是Equal,這是必需的,因為我想確保行和列適合任意數量的視圖。

我的理解是,我可以使用GTE類型約束,而AutoLayout系統將嘗試將該值最小化,使其仍為GTE(對於LTE約束,反之亦然)。 例如,我希望可以將一個視圖的左坐標GTE放置在其他兩個視圖的右邊緣,這樣布局求解器將確定左邊緣的最小值,以便仍然滿足另一個視圖的右邊緣的GTE。觀點。

我創建了一個簡單的示例,但不確定為什么會得到模棱兩可的布局。 我在MonoTouch中創建了一個單視圖項目,並以編程方式添加了一個UIView框用作我的容器(在更復雜的示例中,該視圖框包含多行和多列視圖)。 然后,我僅向框視圖添加一個子視圖,即一個名為myLabel的UILabel。 我添加了約束,以將標簽放置在框內,將框放置在父視圖內,並設置框的右邊緣和下邊緣(這是關鍵部分):

public partial class AutoLayoutTestViewController : UIViewController
{
    public AutoLayoutTestViewController () : base ("AutoLayoutTestViewController", null)
    {
        UIView box = new UIView ();
        box.BackgroundColor = UIColor.Green;
        box.TranslatesAutoresizingMaskIntoConstraints = false;
        View.AddSubview (box);
        View.AddConstraint (NSLayoutConstraint.Create (box, NSLayoutAttribute.Top, NSLayoutRelation.Equal, View, NSLayoutAttribute.Top, 1.0f, 50f));
        View.AddConstraint (NSLayoutConstraint.Create (box, NSLayoutAttribute.Left, NSLayoutRelation.Equal, View, NSLayoutAttribute.Left, 1.0f, 0f));

        UILabel myLabel = new UILabel ();
        myLabel.Text = "My Label";
        myLabel.BackgroundColor = UIColor.Red;
        myLabel.TranslatesAutoresizingMaskIntoConstraints = false;
        box.AddSubview (myLabel);
        box.AddConstraint (NSLayoutConstraint.Create (myLabel, NSLayoutAttribute.Top, NSLayoutRelation.Equal, box, NSLayoutAttribute.Top, 1.0f, 10f));
        box.AddConstraint (NSLayoutConstraint.Create (myLabel, NSLayoutAttribute.Left, NSLayoutRelation.Equal, box, NSLayoutAttribute.Left, 1.0f, 10f));
        // IMPORTANT CONSTRAINTS
        box.AddConstraint (NSLayoutConstraint.Create (box, NSLayoutAttribute.Bottom, NSLayoutRelation.GreaterThanOrEqual, myLabel, NSLayoutAttribute.Bottom, 1.0f, 10f));
        box.AddConstraint (NSLayoutConstraint.Create (box, NSLayoutAttribute.Right, NSLayoutRelation.GreaterThanOrEqual, myLabel, NSLayoutAttribute.Right, 1.0f, 10f));
    }

    public override void DidReceiveMemoryWarning ()
    {
        // Releases the view if it doesn't have a superview.
        base.DidReceiveMemoryWarning ();

        // Release any cached data, images, etc that aren't in use.
    }

    public override void ViewDidLayoutSubviews ()
    {
        base.ViewDidLayoutSubviews ();
        foreach (UIView v in View.Subviews) {
            if (v.HasAmbiguousLayout) {
                Console.WriteLine ("WARNING: View {0} has ambiguous layout!", v);
            }
        }
    }

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();

        // Perform any additional setup after loading the view, typically from a nib.

    }
}

下面的屏幕截圖顯示了框和標簽的顯示方式,但是當視圖控制器完成對子視圖的布局后,我收到消息,顯示框的布局不明確。 如果將框的右邊緣和下邊緣的“重要約束”更改為“等於”,而不是“ GreaterThanOrEqual”,則布局不再模棱兩可。 同樣,重要的是我必須將約束指定為GTE,因為我要針對行和列中任意數量的視圖設置邊框,因此在向表中添加新視圖時,請確保我的權限正確。邊緣被限制為所有視圖的GTE,底部邊緣也類似。 我無法在我的應用程序中使用嚴格等於,因為我不知道表中的哪個子視圖將是最右視圖或最底視圖。 這就是受到GTE約束的原因。

自動版面測試

我的問題是:為什么在我的方框圖中不能使用GTE約束而又沒有模棱兩可的布局? 如果這個簡單的示例不起作用,那么您將如何使用GTE約束(它們將是模棱兩可的,否則首先將它們指定為Equal)?

謝謝你的幫助,

凸輪

通常,我做同樣的事情,使用GTE來確保某事物在一個維度上受到限制,然后添加另一個具有較低優先級的約束來嘗試做其他事情,例如將視圖置於另一個視圖的中心。 你必須要有創造力。 我發現最好的方法是使用鉛筆和紙,勾勒出一個示例,然后嘗試構建我需要什么約束的地方。

我不認為該系統可以平均分配不平等-如果您在左邊有一個,在右邊有一個,那么該怎么辦? 我使用不等式來確保不超過某個最大值,然后使用較低優先級來嘗試實現某些目標(即居中)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM