调用[table reloadData]会从[uiview animatewithduration]中删除表格的位置变化

时间:2014-11-30 14:13:20

标签: ios objective-c uitableview

有一个水平移动我的桌子的按钮。

- (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位置。

2 个答案:

答案 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){

                     }];
}