簡體   English   中英

具有VFL約束的iOS動態自動布局

[英]iOS Dynamic Autolayout with VFL Constraints

嘗試基於設備方向在單個視圖控制器中動態分配約束時遇到意外行為。

所需的行為:如下面的代碼所示,在縱向模式下,我正在使用VFL將視圖附加到視圖的右,上,左邊緣,高度為300,然后切換到左側附加相同的視圖在橫向模式下,頂部邊緣的高度為90,寬度為160。

if (orientation == UIInterfaceOrientation.Portrait || orientation == UIInterfaceOrientation.PortraitUpsideDown)
{
    View.AddConstraints(NSLayoutConstraint.FromVisualFormat("V:|[green(300)]", 0, metrics, views));
    View.AddConstraints(NSLayoutConstraint.FromVisualFormat("H:|[green]|", 0, new NSDictionary(), views));
} 
else
{
    View.AddConstraints(NSLayoutConstraint.FromVisualFormat("V:|[green(90)]", 0, metrics, views));
    View.AddConstraints(NSLayoutConstraint.FromVisualFormat("H:|[green(160)]", 0, metrics, views));
}  

體驗的行為:在視圖的初始加載時以及轉向橫向模式時,我們看到的是縱向模式的期望行為。 但是,當重新回到縱向模式時,此后每次將設備切換到便攜模式但橫向模式繼續起作用時,視圖控件都會消失。 在短人像模式下,僅首次使用。

我已經進行了廣泛的研究,無法確定問題所在。 對於解決方案的任何見解,我將不勝感激。

這是完整的代碼,以防萬一:

using MonoTouch.Foundation;
using MonoTouch.UIKit;
using System;
using System.CodeDom.Compiler;

namespace iOS.UI
{
    partial class TestConstraintsController : UIViewController
    {
        public TestConstraintsController (IntPtr handle) : base (handle)
        {

        }

        public override void ViewWillAppear (bool animated)
        {
            base.ViewWillAppear (animated);
            AdjustGeometry ();
        }


        public override void DidRotate (UIInterfaceOrientation fromInterfaceOrientation)
        {
            base.DidRotate (fromInterfaceOrientation);
            AdjustGeometry ();
        }

        public void AdjustGeometry()
        {
            UIInterfaceOrientation orientation = UIApplication.SharedApplication.StatusBarOrientation;

            NSDictionary views = NSDictionary.FromObjectsAndKeys (
                                                new NSObject[] { greenBox }, 
                                                new NSObject[] { new NSString ("green") }
                                            );

            View.RemoveConstraints (View.Constraints);

            if (orientation == UIInterfaceOrientation.Portrait || orientation == UIInterfaceOrientation.PortraitUpsideDown)
            {
                View.AddConstraints(NSLayoutConstraint.FromVisualFormat("V:|[green(boxHeightPortrait)]", 0, new NSDictionary(), views));
                View.AddConstraints(NSLayoutConstraint.FromVisualFormat("H:|[green]|", 0, new NSDictionary(), views));
            } 
            else
            {
                View.AddConstraints(NSLayoutConstraint.FromVisualFormat("V:|[green(90)]", 0, new NSDictionary(), views));
                View.AddConstraints(NSLayoutConstraint.FromVisualFormat("H:|[green(160)]", 0, new NSDictionary(), views));
            }
        }
    }
}

問題在於,您正在刪除未創建的約束,這些約束正在幫助視圖控制器視圖進行自我布局和子視圖布局。

無需從視圖中刪除所有約束,只需刪除創建的約束(保存從FromVisualFormat返回的約束數組)。

具體來說,在視圖控制器視圖中添加了一些約束,這些約束基於其自動調整大小蒙版來控制其高度(在自動布局引擎中)。 刪除這些元素后,自動布局時會導致視圖控制器的高度為零(盡管它可以很好地繪制,因為仍會根據其自動調整大小蒙版對其進行繪制)。 因此,當您的子視圖試圖填充整個垂直空間時,它只是填充了垂直高度0。

如果要查看差異,只需在每次清除它之前記錄視圖約束數組的內容即可。

暫無
暫無

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

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