我有一个视图需要通过编程方式来操作它的框架 - 它是一种文档视图,可以自动包裹其内容,然后通过操作框架原点在父视图中滚动和缩放。 在运行时,自动布局会与此相冲突。
完全禁用自动布局似乎有些过于严厉,因为它可能合理地用于处理其他视图的布局。 看起来我想要的是某种“空约束”。
我有一个视图需要通过编程方式来操作它的框架 - 它是一种文档视图,可以自动包裹其内容,然后通过操作框架原点在父视图中滚动和缩放。 在运行时,自动布局会与此相冲突。
完全禁用自动布局似乎有些过于严厉,因为它可能合理地用于处理其他视图的布局。 看起来我想要的是某种“空约束”。
UIView
禁用自动布局,而不是像Xcode 4.3及更高版本中默认设置的那样禁用整个xib或storyboard。translatesAutoresizingMaskIntoConstraints
设置为YES
:self.exampleView.translatesAutoresizingMaskIntoConstraints = YES;
self.exampleView.frame = CGRectMake(20, 20, 50, 50);
我曾经遇到过类似的问题,即Autolayout在运行时覆盖了我的一些框架设置(我有一个动态视图,在某些情况下会推送一个新的视图控制器......推送然后按返回按钮会重置初始视图)。
我通过将我的操作代码放在视图控制器的viewDidLayoutSubviews
中来解决这个问题。这似乎是在调用任何约束mojo之后调用的,但在viewDidAppear之前调用,因此用户不会察觉到。
也许只需将 translatesAutoresizingMaskIntoConstraints
设置为 YES
(而不添加其他影响该视图的约束条件),就可以在不与自动布局系统冲突的情况下设置框架。
iOS 8 中,可以将 NSLayoutConstraint 设置为活动或非活动状态。因此,如果我使用界面生成器,则可以将所有约束添加到 OutletCollection,然后使用以下方法激活或停用:
NSLayoutConstraint.deactivateConstraints(self.landscapeConstraintsPad)
NSLayoutConstraint.activateConstraints(self.portraitConstraintsPad)
我不知道这是否会对其他人有所帮助,但我写了一个分类来方便自己,因为我经常需要这样做。
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的自定义运行时属性中设置translatesAutoresizingMaskIntoConstraints
类型Boolean
,值为Yes。
self.captionUILabel.translatesAutoresizingMaskIntoConstraints = true
如果您想为某些视图使用自动布局,可以将其拆分到多个storyboard中。
不要在界面构建器中放置视图或组件。
纯编程方式添加视图,从alloc/init开始,并适当设置它们的框架。
完成。
对我来说,通过编程方式创建子视图是有效的,在我的情况下,自动布局会影响到我需要围绕其中心旋转的视图,但一旦我通过编程方式创建了这个视图,它就可以正常工作。
self.exampleView.setTranslatesAutoresizingMaskIntoConstraints(true)
- TimWhiting