我正在尝试以编程方式向UITableViewCell中的所选UITextField添加约束。它已成功添加,并且选定的文本字段宽度正在增加。 但是当我尝试删除添加的约束时,它就不起作用了。可以任何人弄清楚我在做错误的地方吗?
-(void)setViewMovedUp:(BOOL)movedUp
{
if (self.currentTextField.tag!=HEADER_FIELD_TAG) {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3]; // if you want to slide up the view
[self.view bringSubviewToFront:self.currentTextField];
NSLayoutConstraint *constraintTrail = [NSLayoutConstraint constraintWithItem:self.currentTextField.superview
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:self.currentTextField
attribute:NSLayoutAttributeTrailing
multiplier:1.0
constant:0.0];
CGRect rect = self.view.frame;
CGRect tableRect = self.currentTextField.frame;
if (movedUp)
{
// 1. move the view's origin up so that the text field that will be hidden come above the keyboard
// 2. increase the size of the view so that the area behind the keyboard is covered up.
[self.currentTextField.superview addConstraint:constraintTrail];
rect.origin.y -= kOFFSET_FOR_KEYBOARD;
rect.size.height += kOFFSET_FOR_KEYBOARD;
tableRect.size.width += 800;
}
else
{
// revert back to the normal state.
[self.currentTextField.superview removeConstraints:@[constraintTrail]];
rect.origin.y += kOFFSET_FOR_KEYBOARD;
rect.size.height -= kOFFSET_FOR_KEYBOARD;
tableRect.size.width -= 800;
}
infoFieldTable.frame = tableRect;
self.view.frame = rect;
[UIView commitAnimations];
}
}
答案 0 :(得分:0)
嗯,它显然不起作用。
如果我想对了,setViewMovedUp
是一个setter,在viewMovedUp
属性发生变化时执行。
执行方法时,使用以下命令创建新约束:
NSLayoutConstraint *constraintTrail = [NSLayoutConstraint constraintWithItem:self.currentTextField.superview
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:self.currentTextField
attribute:NSLayoutAttributeTrailing
multiplier:1.0
constant:0.0];
根据movedUp
的值,您可以添加它或尝试删除它。因此,如果您连续5次将viewMovedUp
设置为YES
,则您将拥有5个约束。当您将其设置为NO
时,您尝试删除新创建的约束,而不是先前添加的约束。
您最想要的是为该约束创建属性:
@property (nonatonic, strong) NSLayoutContraint *constraintTrail;
并将您的代码更改为:
if (!self.contraintTrail) {
self.contraintTail = [NSLayoutConstraint constraintWithItem:self.currentTextField.superview
attribute:NSLayoutAttributeTrailing
relatedBy:NSLayoutRelationEqual
toItem:self.currentTextField
attribute:NSLayoutAttributeTrailing
multiplier:1.0
constant:0.0];
}
这样,您只需在NSLayoutContraint
实例上创建,然后重复使用它。
答案 1 :(得分:0)
我的建议是只添加一次约束(可能在设置方法或事件中storyboard
并且有一个IBOutlet
),然后根据您的逻辑激活/停用它。 / p>
-(void)setViewMovedUp:(BOOL)movedUp
{
if (self.currentTextField.tag!=HEADER_FIELD_TAG) {
// All your logic here ...
// Set the active property on the constraint
[self.constraintTrail setActive:movedUp];
}
}
另一点是,在更改约束后,您不会调用layoutIfNeeded
。此方法使视图使用新约束重新布局其子视图。
希望它有效!让我知道它是怎么回事:)