Answers:
我有同样的问题。但是我已经解决了。
是的,您可以在运行时为特定的禁用自动布局UIView
,而不是对Xcode 4.3及更高版本中默认设置的整个xib或Storyboard 禁用自动布局。
设置translatesAutoresizingMaskIntoConstraints
为YES
之前,先设置子视图的框架:
self.exampleView.translatesAutoresizingMaskIntoConstraints = YES;
self.exampleView.frame = CGRectMake(20, 20, 50, 50);
我有一个类似的问题,即Autolayout在运行时会覆盖我的某些帧设置(我有一个动态视图,在某些情况下,该视图推了一个新的视图控制器...按下然后按Back将重置初始视图)。
我通过将操作代码放入viewDidLayoutSubviews
View Controller 中来解决此问题。似乎在调用了约束mojo之后但在viewDidAppear之前调用了此方法,因此用户再合适不过了。
在iOS 8中,您可以将NSLayoutConstraint设置为活动或不活动。因此,如果使用接口构建器,则将所有约束添加到OutletCollection,然后使用以下方法激活或停用:
NSLayoutConstraint.deactivateConstraints(self.landscapeConstraintsPad)
NSLayoutConstraint.activateConstraints(self.portraitConstraintsPad)
我在这里使用的特定应用在纵向和横向模式下具有不同的约束,并且我会根据设备的旋转来激活/停用。这意味着我可以在两种方向的界面构建器中创建所有复杂的布局更改,并且仍然使用自动布局,而无需冗长的自动布局代码。
或者,您可以使用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];
}];
希望能帮助到你。
如果要对某些视图使用自动布局,则可以拆分多个情节提要。
除了禁用自动布局之外,我只用要替换的帧计算新约束。在我看来,这是适当的方法。如果要调整依赖约束的组件,请相应地调整它们。
例如,如果两个视图(myView和otherView)之间的垂直约束为0,并且具有平移手势或用于调整myView高度的对象,则可以使用调整后的值重新计算约束。
self.verticalConstraint.constant = newMyViewYOriginValue - (self.otherView.frame.origin.y + self.otherView.frame.size.height);
[self.myView needsUpdateConstraints];
如果是xib文件: