我可以在运行时禁用特定子视图的自动布局吗?

我有一个观点,需要有其框架编程操作 – 这是一种文件视图,其中包含的内容,然后通过操纵框架的原点滚动和放大超视图。 Autolayout在运行时与此战斗。

完全禁用自动布局似乎有点苛刻,因为它可以合理地用于处理其他视图的布局。 看来我可能想要的是某种“空限制”。

我有同样的问题。 但是我已经解决了。
是的,您可以在运行时为特定的UIView禁用自动布局,而不是在Xcode 4.3及更高版本中默认设置的整个xib或storyboard中禁用它。

设置translatesAutoresizingMaskIntoConstraintsYES ,然后设置子视图的框架:

 self.exampleView.translatesAutoresizingMaskIntoConstraints = YES; self.exampleView.frame = CGRectMake(20, 20, 50, 50); 

我有一个类似的问题,Autolayout在运行时重写了一些框架设置(我有一个dynamic的观点,在某些情况下,推动一个新的视图控制器…推,然后按下Back将重置初始视图)。

我通过将我的操作代码放在View Controller的viewDidLayoutSubviews来解决这个问题。 这似乎调用任何约束mojo被调用后,但在viewDidAppear之前,所以用户是没有更聪明的。

也许只是将translatesAutoresizingMaskIntoConstraints设置为YES (并且不会添加影响该视图的附加约束),可以让您设置框架而不与自动布局系统发生冲突。

在iOS 8中,您可以将NSLayoutConstraint设置为活动或不活动。 所以,如果我使用接口生成器,我将所有约束添加到OutletCollection,然后激活或停用使用:

 NSLayoutConstraint.deactivateConstraints(self.landscapeConstraintsPad) NSLayoutConstraint.activateConstraints(self.portraitConstraintsPad) 

我在这里使用的特定应用程序在纵向和横向模式下具有不同的约束,并且基于设备的旋转来激活/停用。 这意味着我可以在界面生成器中为两个方向创build一些复杂的布局更改,并且仍然使用自动布局而不使用详细的自动布局代码。

或者你可以使用removeConstraints和addConstraints来激活/停用。

我不知道这是否会帮助其他人,但是我写了一个类别来使这个方便,因为我发现自己做了很多。

UIView的+ DisableAutolayoutTemporarily.h

 #import <UIKit/UIKit.h> @interface UIView (DisableAutolayoutTemporarily) // the view as a parameter is a convenience so we don't have to always // guard against strong-reference cycles - (void)resizeWithBlock:(void (^)(UIView *view))block; @end 

UIView的+ DisableAutolayoutTemporarily.m

 #import "UIView+DisableAutoResizeTemporarily.h" @implementation UIView (DisableAutoResizeTemporarily) - (void)resizeWithBlock:(void (^)(UIView * view))block { UIView *superview = self.superview; [self removeFromSuperview]; [self setTranslatesAutoresizingMaskIntoConstraints:YES]; __weak UIView *weakSelf = self; block(weakSelf); [superview addSubview:self]; } @end 

我这样使用它:

 [cell.argumentLabel resizeWithBlock:^(UIView *view) { [view setFrame:frame]; }]; 

希望它有帮助。

您可以在xib / storyboard中的UIView的用户定义运行时属性中设置translatesAutoresizingMaskIntoConstraintstypesBoolean值,值为是。

  • 在4.5中打开项目
  • select故事板
  • 打开文件检查器
  • 在界面生成器文档下取消选中“使用Autolayout”

如果您想为某些视图使用自动布局,则可以分割多个故事板。

对我来说,它的工作是以编程方式创build子视图,在我的情况下,自动布局搞乱了我需要围绕其中心旋转的视图,但是一旦我以编程方式创build了这个视图,它就工作了。

这发生在一个没有故事板或xib文件的项目中。 所有100%的代码。 我在底部有一个广告横幅,并希望视图边界停在广告横幅。 加载后视图会自动resize。 我尝试了这个页面上的每个解决scheme,但没有一个工作。

我最终创build了一个缩短高度的子视图,并将其放置在控制器的主视图中。 然后我所有的内容都进入了子视图。 这很容易解决了这个问题,没有做任何事情,感觉就像是对谷物。

我想如果你想要一个不是正常大小的视图,那么你应该使用子视图。

我遇到过类似的情况,我join了一个以自动布局启动的项目,但是我需要对几个视图进行dynamic调整。 这是什么为我工作:

  1. 不要在界面构build器中列出视图或组件。

  2. 以alloc / init开始,以编程方式添加你的视图并适当地设置它们的框架。

  3. 完成。

而不是禁用自动布局,我只是用你正在replace的框架来计算新的约束。 在我看来这是合适的方法。 如果您正在调整依赖于约束的组件,请相应地调整它们。

例如,如果在两个视图(myView和otherView)之间有一个垂直约束0,并且您有一个平移手势或调整myView高度的东西,则可以使用调整的值重新计算约束。

 self.verticalConstraint.constant = newMyViewYOriginValue - (self.otherView.frame.origin.y + self.otherView.frame.size.height); [self.myView needsUpdateConstraints]; 

对于那些使用自动布局的人,请在这里查看我的解决scheme。 你应该使@IBOutlet的约束,你想调整,然后改变它们的常量。

在我看来,我有一个标签和一个文本。 标签有平底锅的手势。 拖动时标签正好移动。 但是,当我使用文本框键盘时,标签将其位置重置为自动布局中定义的原始位置。 当我在标签中快速添加以下内容时问题得到解决。 我在viewWillAppear中添加了这个,但是它可以添加到你有权访问目标字段的任何地方。

 self.captionUILabel.translatesAutoresizingMaskIntoConstraints = true 

如果是xib文件:

  1. select.xib文件
  2. select“文件所有者”
  3. 显示实用程序
  4. 点击“File Inspector”
  5. 在“Interface Builder Document”下禁用:“使用Autolayout”