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中的一些设置引起的。 尝试删除其中的一些,看看它是否有效,找出什么是错的