繁体   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