Sea*_*ser 7 uitextfield ios autolayout
我正在为UITextField创建子类,在左侧添加标签.我正在使用autolayout来布局标签.但是,我一直在崩溃:
这是我如何做我的布局代码:
- (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];
Run Code Online (Sandbox Code Playgroud)
}
当我不对文本字段进行任何调整时,这很好.
但是,如果我尝试设置占位符文本,我会得到以下异常:
由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'执行-layoutSubviews后仍需要自动布局.DDSegmentedTextField的-layoutSubviews实现需要调用super.
但是,我并没有覆盖-layoutSubviews.
有没有遇到过这个?我究竟做错了什么?
谢谢!
所以几天前我也遇到了同样的错误.事实证明,我试图在我的UITextfield子类中布置子视图,设置它们的属性,移动它们等,但从未明确地告诉视图自己(即调用[self layoutIfNeeded]).
iOS 8似乎迫使视图布局其所有子视图,然后在其上配置约束.iOS 7不会,并且如果您正在使用自动布局,则需要您在更改时明确告知视图重绘其子视图.
就我而言,我已经进行了子类化UITextField并在侧面添加了一个标签.我通过向UITextfield添加约束来配置标签的框架.我可以在班上打电话的一种公共方法是
- (void)setLabelText:(NSString *)newText{
self.sideLabel.text = newText;
}
Run Code Online (Sandbox Code Playgroud)
当视图控制器出现包含我的子类文本字段时,这导致我的应用程序崩溃.通过添加layoutIfNeeded一切现在可以在iOS7和iOS8中正常工作.
- (void)setLabelText:(NSString *)newText{
self.sideLabel.text = newText;
[self layoutIfNeeded];
}
Run Code Online (Sandbox Code Playgroud)
每次更改子类中视图的一部分时都需要调用它.这包括添加子视图时的设置,更改视图属性时的任何设置.在更改视图返回的功能之前,请调用layoutIfNeeded您的视图.这似乎适用于一些标准的UI控件,包括UITextfield,UITableView和UICollectionView,虽然我确定还有其他的.我希望这很清楚,并帮助解决您的问题.
你得到的错误不是很有用,甚至不适用于我的情况.虽然我收到了完全相同的错误,但我的所有视图都没有实现layoutSubviews,因此都在使用该[super layoutSubviews]方法.
| 归档时间: |
|
| 查看次数: |
3053 次 |
| 最近记录: |