UITextField中的Autolayout:在执行-layoutSubviews之后仍然需要自动布局
我inheritanceUITextField在左侧添加一个标签。 我正在使用自动布局来布置标签。 但是,我不断收到这个崩溃:
这是我如何做我的布局代码:
- (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];
}
当我不做任何调整的文本字段,这工作正常。
但是,如果我尝试设置占位符文本,我得到这个exception:
由于未捕获exception“NSInternalInconsistencyException”而终止应用程序,原因是:执行-layoutSubviews之后仍然需要自动布局。 DDSegmentedTextField的-layoutSubviews实现需要调用super。
不过,我并不是重写-layoutSubviews。
有没有人遇到过这个? 我究竟做错了什么?
谢谢!
所以我也在前几天遇到了同样的错误。 事实certificate,我试图在我的UITextfield
子类内部布局子视图,设置它们的属性,移动它们等,但从来没有明确地告诉视图放置出来(即调用[self layoutIfNeeded]
)。
iOS 8似乎强制一个视图来布置所有的子视图,然后configuration它的约束。 如果您使用自动布局,iOS 7将不会,并且需要您明确告诉视图以在您更改时重绘其子视图。
在我的情况下,我已经分类UITextField
并添加一个标签的一面。 我通过向UITextfield添加约束来configuration标签的框架。 我可以给我的class级打电话的公共方法之一是
- (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]
方法。
这个问题出现在iOS <8
在创buildUIView子类和添加视图的同时,我们可以指示控件首先构造和自动布局子视图。 需要更新UI时使用以下语句:
[self layoutIfNeeded];
iOS 8+正在内部自行处理这个问题。
我遇到过同样的问题。 这可能是由错误的约束引起的,也许是由Storyboard中的一些设置引起的。 尝试删除其中的一些,看看它是否有效,找出什么是错的
- 缩进UITableViewCell中的所有自动布局约束
- AutoLayout约束问题与意外的NSAutoresizingMaskLayoutConstraint
- iOS Autolayout如何水平拉伸2个button
- 如何使用自动布局在代码中使用多行标签创build和添加UIButton?
- UITableViewCellAccessoryCheckmark和AutoLayout约束
- UITableView单元格内容不能正确显示
- iOS如何根据其中的UILabel制作UIViewdynamic宽度/自动布局
- 约束在两个UIViews之间添加更多的空间
- 在Swift中,在运行时更改Autolay约束UIView的框架