使用动画调整表格大小时,UITableViewCell内容布局的奇怪行为

时间:2013-10-17 13:36:58

标签: ios

我正在尝试创建一个视图层次结构,其中的菜单会在用户拉动滑块时从屏幕左侧“滑出”。菜单实现为包含一堆单元格的表格。每个单元格都有一个图像和一个文本。我正在动画表格大小的变化。当我使用autolayout时,这是我的代码:

@interface MyController : UIViewController {
    CGFloat size;//0 .. self.frame.size.width * drawerPortion
    NSLayoutConstraint *constraint;
    UITableViewController *tableViewController;
}

// ...
@end

@implementation MyController
- (void)viewDidLoad {
//...
    UIView *view = tableViewController.view;
    [self.view addSubview:view];
    constraint = [NSLayoutConstraint constraintWithItem:view
                                                    attribute:NSLayoutAttributeWidth
                                                    relatedBy:NSLayoutRelationEqual
                                                       toItem:nil
                                                    attribute:NSLayoutAttributeNotAnAttribute
                                                   multiplier:1
                                                     constant:0];
    [view addConstraint:constraint];

    [self redrawTable];

}

- (void)makeDrawerVisible:(BOOL)visible {
    size = visible ? 224 : 0;
    [UIView animateWithDuration:0.5
                          delay:0
                        options:UIViewAnimationOptionLayoutSubviews
                     animations:^{[self redrawTable];}
                 }];
 }

- (void)redrawTable {
    constraint.constant = size;
    [self.view layoutIfNeeded];
}


// ...
@end

tableViewControllerUITableViewController的非常基本的教科书实现。单元格创建如下:

UITableCell *cell = [[UITableCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
cell.textLabel.text = @"Loren ipsum";
cell.imageView.image = [UIImage imageNamed:@"group"];

最初,在我启动应用程序后,菜单创建为零宽度​​,因此被隐藏。当我拉动滑块时,整个动画很好地动画到指定的宽度(224)。以下是我的模拟器的截图,动画中间的视图和最终结果。

middle of animation - correct final result of animation

在我将表格动画回到零大小之后,奇怪的事情开始发生。标签上的文字向左滑动,并被图像部分遮挡。以下是它的外观:

middle of animation - incorrect

从这一刻开始,只要我来回动画菜单,我就会继续观察这种令人讨厌的效果。有没有人遇到类似的问题?有没有办法阻止标签在动画过程中重新定位?任何关于如何在超视图动画期间重新布局子视图的良好文档的指针也将受到赞赏。几天来我一直在抨击这个问题并且一无所获。

1 个答案:

答案 0 :(得分:0)

约束和/或调整大小的掩码正在为您完成。而不是做约束操作,将幻灯片菜单放在黑色视图后面,然后转换主视图(在这种情况下,来回黑色)示例

if(isOpening)
{
    mainView.transform = CGAffineTransformTranslate(mainView.transform, someValueToShiftRight, 0.0f);
}
else
{
    mainView.transform = CGAffineTransformIdentity;
}