2015-05-15 27 views
0

当尝试根据设备方向在单个视图控制器中动态分配约束时,我遇到意外的行为。带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)); 
      } 
     } 
    } 
} 

回答

1

的问题是,你删除您没有创建了帮助视图控制器查看奠定自己和子视图进行约束。

而不是从您的视图中删除所有的约束,只是删除你创建的约束(保存从FromVisualFormat返回的约束数组)。

具体来说,有一些约束被添加到视图控制器视图中,该视图基于其自动识别掩码控制其高度(在自动布局引擎中)。当它们被删除时,它会导致您的视图控制器在自动布局时具有零高度(尽管它仍然基于其自动识别掩码绘制,因此绘制得很好)。因此,当您的子视图试图填充整个垂直空间时,它只填充垂直高度0.

如果您想查看其差异,请在每次清除视图约束数组之前记录它们的内容。

+0

非常感谢! – Razor