有一个水平移动我的桌子的按钮。
- (void)togglePreferencePageVisibility:(id)sender {
int translation = [self preferencesVisible] ? -PREFERENCE_TRANSLATION_HEIGHT : PREFERENCE_TRANSLATION_HEIGHT;
//animate tableview down
[UIView animateWithDuration:0.3
delay:0
options: UIViewAnimationCurveEaseOut
animations:^{
_table.center = CGPointMake(_table.center.x, _table.center.y+translation);
}
completion:^(BOOL finished){
}];
}
当我拨打[_table reloadData]
时,表格会恢复到原来的位置。我尝试手动重新调整表位置,如此
NSLog(@"before %@", NSStringFromCGRect(_table.frame));
[_table reloadData];
_table.frame = CGRectMake(initialTablePosition.x, initialTablePosition.y+PREFERENCE_TRANSLATION_HEIGHT, _table.frame.size.width, _table.frame.size.height);
NSLog(@"after %@", NSStringFromCGRect(_table.frame));
但没有运气。此外,框架在前后具有相同的y位置。
答案 0 :(得分:0)
您还需要使用NSLayoutConstraint类调整自动布局约束。您可以添加,删除或更改NSLayoutConstraints的值。由于从iOS 7到iOS 8的更改,这是目前关于堆栈溢出的一个非常常见的问题。
如果不调整布局约束,则视图将重新定位回原始位置。 reloadData
重绘UITableView,导致视图层次结构重新检查其位置e.t.c。
作为使宽度约束更窄的视图的示例:
CGRect frame = myView.frame;
frame.size.width -= 100;
//Next line now needed in iOS 8
myWidthConstraint.constant -= 100;
[UIView animateWithDuration:0.5 animations:^{
[myView setFrame:frame];
}];
编辑:退回示例:
CGRect frame = myView.frame;
frame.size.width += 100;
//Next line now needed in iOS 8
myWidthConstraint.constant += 100;
[UIView animateWithDuration:0.5 animations:^{
[myView setFrame:frame];
}];
答案 1 :(得分:0)
使用自动布局时,不应设置任何帧。如果这样做,当视图需要重绘时,帧将重置为由其约束定义的帧。您应该将IBOutlet添加到您的表视图与其超级视图的顶部(或者适用于您的底部)之间的约束(我将在下面的示例中将其称为topCon)。
- (void)togglePreferencePageVisibility:(id)sender {
int translation = [self preferencesVisible] ? -PREFERENCE_TRANSLATION_HEIGHT : PREFERENCE_TRANSLATION_HEIGHT;
//animate tableview down
self.topCon.constant += translation; // this might need to be "-=" depending on whether your constraint is to the top or bottom
[UIView animateWithDuration:0.3
delay:0
options: UIViewAnimationCurveEaseOut
animations:^{
[self.view layoutIfNeeded];
}
completion:^(BOOL finished){
}];
}