gpt4 book ai didi

具有 VFL 约束的 iOS 动态自动布局

转载 作者:行者123 更新时间:2023-11-29 02:01:52 25 4
gpt4 key购买 nike

当我尝试根据设备方向在单个 View Controller 中动态分配约束时,我遇到了意外的行为。

期望的行为:如下面的代码所示,我使用 VFL 将 View 附加到 super View 的右边缘、上边缘和左边缘,在纵向模式下高度为 300,然后在横向模式下切换到将相同的 View 附加到左侧和顶部边缘,高度为 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));
}

经验丰富的行为:我们在 View 的初始加载以及转向横向模式时看到了纵向模式所需的行为。但是,当返回到纵向模式时,此后每次当设备转到预兆模式但横向模式继续运行时, View 控件都会消失。简而言之,人像模式仅在第一次使用时有效。

我做了相当广泛的研究,但无法找出问题所在。如果对解决方案有任何见解,我将不胜感激。

为了以防万一,这里是完整的代码:

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));
}
}
}
}

最佳答案

问题是您正在删除您未创建的约束,这些约束有助于 View Controller View 自行布局和 subview 。

无需从您的 View 中删除所有约束,只需删除您创建的约束(保存从 FromVisualFormat 返回的约束数组)。

具体来说, View Controller View 中添加了一些约束,这些约束基于其自动调整掩码来控制其高度(在自动布局引擎中)。当这些被删除时,它会导致您的 View Controller 在自动布局时的高度为零(尽管它绘制得很好,因为它仍在根据其自动调整大小的掩码绘制)。因此,当您的 subview 试图填充整个垂直空间时,它只是填充垂直高度为 0。

如果您想看到差异,只需在每次清除之前记录 View 约束数组的内容即可。

关于具有 VFL 约束的 iOS 动态自动布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30266389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com