当尝试根据设备方向在单个视图控制器中动态分配约束时,我遇到意外的行为。带VFL约束的iOS动态自动拨号
期望的行为:如下面的代码所示,我使用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));
}
}
}
}
非常感谢! – Razor