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

ter*_*ory 102 xcode interface-builder xcode4 xcode4.3 autolayout

我有一个视图,需要以编程方式操作它的框架 - 它是一种包含其内容的文档视图,然后通过操作框架原点滚动并围绕超视图进行缩放.Autolayout在运行时与此斗争.

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

Muh*_*Ali 168

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

设置translatesAutoresizingMaskIntoConstraintsYES,您设置子视图的帧之前:

self.exampleView.translatesAutoresizingMaskIntoConstraints = YES;
self.exampleView.frame = CGRectMake(20, 20, 50, 50);
Run Code Online (Sandbox Code Playgroud)

  • 它向我显示警告:"无法同时满足约束条件." (5认同)
  • 对于一些具有大量视图的更复杂的情况,这看起来有些过分.对于像这样简单的事情,这没关系. (2认同)
  • @DinhNhat我澄清了答案.删除和重新添加子视图不是必需的. (2认同)

jms*_*617 49

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

通过将我的操作代码放入viewDidLayoutSubviewsView Controller 中,我解决了这个问题.这似乎是在调用任何约束mojo之后调用,但是在viewDidAppear之前调用,所以用户不是更聪明的.

  • 这对我也有用.我浪费了2小时:22米撞到了众所周知的墙上,然后才发现这个变通方法. (2认同)

Jon*_*ull 26

也许只设置translatesAutoresizingMaskIntoConstraintsYES(而不是将影响该视图的附加限制)都会让你设置框架不战而自动布局系统.


ban*_*isa 17

在iOS 8中,您可以将NSLayoutConstraint设置为活动与否.因此,如果我正在使用界面构建器,我将所有约束添加到OutletCollection,然后使用以下命令激活或停用:

NSLayoutConstraint.deactivateConstraints(self.landscapeConstraintsPad)
NSLayoutConstraint.activateConstraints(self.portraitConstraintsPad)
Run Code Online (Sandbox Code Playgroud)

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

或者您可以使用removeConstraints和addConstraints激活/停用.


mic*_*den 8

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

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我这样使用它:

[cell.argumentLabel resizeWithBlock:^(UIView *view) {
    [view setFrame:frame];
}];
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.


小智 6

您可以在xib/storyboard中所需的UIView的用户定义的运行时属性中设置translatesAutoresizingMaskIntoConstraints类型Boolean值Yes.


Mik*_*itt 3

  • 在4.5中打开项目
  • 选择故事板
  • 打开文件检查器
  • 在 Interface Builder Document 下取消选中“使用自动布局”

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

  • 这会禁用整个故事板/笔尖的自动布局。我正在寻找一种方法(最好是编程),使故事板/笔尖中的特定子视图不使用自动布局,而让其余部分执行故事板/笔尖指定的任何操作。 (10认同)