这是我如何做我的布局代码:
- (void)updateConstraints { self.segmentLabel.translatesAutoresizingMaskIntoConstraints = NO; NSLayoutConstraint *constraint; constraint = [NSLayoutConstraint constraintWithItem:self.segmentLabel attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeHeight multiplier:1.0 constant:0.0f]; [self addConstraint:constraint]; constraint = [NSLayoutConstraint constraintWithItem:self.segmentLabel attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeading multiplier:1.0 constant:0.0f]; [self addConstraint:constraint]; constraint = [NSLayoutConstraint constraintWithItem:self.segmentLabel attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0f]; [self addConstraint:constraint]; constraint = [NSLayoutConstraint constraintWithItem:self.segmentLabel attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:self.segmentWidth]; [self addConstraint:constraint]; [super updateConstraints];
}
当我不对文本字段进行任何调整时,这很好用.
但是,如果我尝试设置占位符文本,我会得到以下异常:
Terminating app due to uncaught exception ‘NSInternalInconsistencyException’,reason: ‘Auto Layout still required after executing -layoutSubviews. DDSegmentedTextField’s implementation of -layoutSubviews needs to call super.’
但是,我并没有覆盖-layoutSubviews.
有没有人遇到过这个?我究竟做错了什么?
谢谢!
解决方法
iOS 8似乎强制要查看布局其所有子视图,然后在其上配置约束. iOS 7不会,并且如果您正在使用自动布局,则需要您在更改时明确告知视图重绘其子视图.
在我的例子中,我已经将UITextField子类化,并在侧面添加了一个标签.我通过向UITextfield添加约束来配置标签的框架.我可以在班上打电话的一种公共方法是
- (void)setLabelText:(NSString *)newText{ self.sideLabel.text = newText; }
当视图控制器出现包含我的子类文本字段时,这导致我的应用程序崩溃.通过添加layoutIfNeeded,现在在iOS7和iOS8中一切正常.
- (void)setLabelText:(NSString *)newText{ self.sideLabel.text = newText; [self layoutIfNeeded]; }
每次更改子类中视图的一部分时都需要调用它.这包括添加子视图时的设置,更改视图属性时的设置.在更改视图返回的函数返回之前,请在视图上调用layoutIfNeeded.这似乎适用于一些标准的UI控件,包括UITextfield,UITableView和UICollectionView,虽然我确定还有其他的.我希望这很清楚,并帮助解决你的问题.
你得到的错误并不是非常有用,甚至不适用于我的情况.虽然我收到了完全相同的错误,但是我的所有视图都没有实现layoutSubviews,因此都使用了[super layoutSubviews]方法.