当前位置: 首页 > 知识库问答 >
问题:

如何使用自动布局设置UITableViewCell高度的动画?

宋伯寅
2023-03-14

关于UITableViewCell高度动画,在堆栈溢出方面有很多类似的问题,但对于新的iOS8自动布局驱动的表视图,这些问题都不起作用。我的问题:

定义单元格:

@property (weak, nonatomic) IBOutlet iCarousel *carouselView;
@property (weak, nonatomic) IBOutlet UIPageControl *pageControl;
@property (weak, nonatomic) IBOutlet UIButton *seeAllButton;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *carouselHeightConstraint;

注意旋转木马高度限制。这是内容视图的子视图(唯一的子视图)的高度约束。

然后,在“查看我要展开的所有操作”单元上,我的代码

- (IBAction)seeAllButtonAction:(id)sender {
  
  BOOL vertical = !self.carouselCell.carouselView.vertical;
  self.carouselCell.carouselView.type = vertical ? iCarouselTypeCylinder : iCarouselTypeLinear;
  self.carouselCell.carouselView.vertical = vertical;

  [UIView transitionWithView:self.carouselCell.carouselView
                    duration:0.2
                     options:0
                  animations:^{
  
    self.carouselCell.carouselHeightConstraint.constant = vertical ? CGRectGetHeight(self.tableView.frame) : 230;
    [self.carouselCell setNeedsUpdateConstraints];
    [self.carouselCell updateConstraintsIfNeeded];
    [self.tableView beginUpdates];
    [self.tableView endUpdates];

                  completion:^(BOOL finished) {
                  }];
}

如您所见,我尝试使用这个很好的旧解决方案:
您可以在选中UITableViewCell时设置高度更改的动画吗?

结果是:

我的手机缩小到44.0华氏度。

为什么会这样?我希望看到我的细胞用自动布局的魔法顺利扩展。

注意:
我不想使用-tableView:heightForRowAtIndexPath:。现在是自动布局时代,对吗?

共有2个答案

赵星华
2023-03-14

我想对亚历克斯的回答补充几点。

如果您在cell ForRowAtIndexPath或will DisplayCell中调用起始更新和终止更新,您的应用程序将崩溃。对单元格的增加进行动画处理后,您可能希望它在滚动到表格视图后保持不变。您可能还希望其余单元格保持其高度不变。但请记住,单元格是可重用的,因此您最终可能会看到其他单元格的高度增加。

因此,您必须在cell ForRowAtIndexPath中设置约束常量,具体取决于它所代表的项目。但是如果您之后调用layoutIfNeed,它将显示带有您的约束的警告。我相信它会尝试在计算其新高度之前生成单元格布局。

public func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
...
    myConstraint.constant = itemForCell.value == "x" ? 50 : 20 // stop right here
    cell.layoutIfNeeded() <- don't do this or some of your constraints will break
    beginUpdates() <-- if you do this your app will crash
    endUpdates() <-- same here
厉文栋
2023-03-14

以下几点对我有用:

准备:

>

  • 在viewDidLoad上,告诉表格视图使用自调整大小的单元格:

    tableView.rowHeight = UITableViewAutomaticDimension;
    tableView.estimatedRowHeight = 44; // Some average height of your cells
    

    像往常一样添加约束,但要将它们添加到单元格的内容视图中!

    设置高度更改动画:

    假设您更改约束的常量:

    myConstraint.constant = newValue;
    

    。。。或者添加/删除约束。

    要设置此更改的动画,请按以下步骤进行:

    >

    [UIView animateWithDuration: 0.3 animations: ^{ [cell.contentView layoutIfNeeded] }]; // Or self.contentView if you're doing this from your own cell subclass
    

    然后用动画告诉表格视图对高度变化做出反应

    [tableView beginUpdates];
    [tableView endUpdates];
    

    第一步0.3的持续时间似乎是UITableView在调用开始/结束更新时为其动画使用的持续时间。

    奖励-更改高度而无需动画,也无需重新加载整个表格:

    如果您想做与上述相同的事情,但没有动画,请改为这样做:

    [cell.contentView layoutIfNeeded];
    [UIView setAnimationsEnabled: FALSE];
    [tableView beginUpdates];
    [tableView endUpdates];
    [UIView setAnimationsEnabled: TRUE];
    

    总结:

    // Height changing code here:
    // ...
    
    if (animate) {
        [UIView animateWithDuration: 0.3 animations: ^{ [cell.contentView layoutIfNeeded]; }];
        [tableView beginUpdates];
        [tableView endUpdates];
    }
    else {
        [cell.contentView layoutIfNeeded];
        [UIView setAnimationsEnabled: FALSE];
        [tableView beginUpdates];
        [tableView endUpdates];
        [UIView setAnimationsEnabled: TRUE];
    }
    

    您可以查看我的一个单元格实现,当用户在此处选择它时,它会扩展(纯Swift

  •  类似资料:
    • 我花了两天时间尝试了混合和纯自动布局方法的各种解决方案,以实现在自动布局之前简单的滚动视图设置,现在它是正式的了——我一定太傻了。我主要是在故事板中设置这个(嗯,就是这样)。 所以我请求帮助。 视图树: 按钮应该水平滚动(从左到右,反之亦然)。有人能告诉我如何设置约束来使用纯自动布局实现这一点吗??? -- 我尝试了混合方法,如下所示: ...以及根据Apple的TechNote为< code>c

    • 我不使用GUI编辑器手动创建布局,我需要将高度设置为“自动”,以便用户可以看到整个表单。我将GridLayout包装到FlowLayout中,这样输入就不会被拉伸。创建这样的布局的最佳实践是什么。是否有人可以修改它,使整个表单可见或使用GridLayout,但可以设置表单中输入的宽度和高度? 未使用包装方法设置首选尺寸 使用包装方法设置首选尺寸 将扩展状态设置为最大化,但更新按钮不完全可见。如何设

    • 在过去的几天里,我试图使用自动布局约束完成一个相当简单(至少应该是这样)的布局,但没有成功。 我的视图层次结构是:< br> UIScrollView - UIView(容器视图)< br> - UILabel(多行标签)< br >-ui webview < br >-ui label < br >-ui button 所需的功能是根据内容的大小扩展容器视图。为了增加UIWebView的高度,我

    • 我刚开始更彻底地使用AutoLayout,遇到了一个大问题: 我有一个视图,其中一些子视图附着在其顶部,一些子视图附着在其底部,因此当视图的高度发生变化时,子视图会相应地移动。根据用户的操作,子视图的高度可以更改(=其高度约束值更改),这可能会导致它们不再适合其父视图。 如何确定一组新的约束是否需要更改父视图的高度以适应其所有子视图?最好在我显示具有新约束的所有字段之前-我希望视图的高度同时改变。

    • 我正在尝试习惯使用自动布局和约束的动画,而不是使用帧的动画。在我的项目中,我在屏幕顶部附近有一个UIView,我正试图直接向下(y位置)设置动画。我知道我必须修改约束常量值,但这样做会降低视图的高度,而不是像我想要的那样向下“推”视图。这是我的代码: 顶部约束是视图控制器视图顶部和视图之间的垂直空间约束。 的其他约束包括: > 水平间距 垂直空间(

    • 问题内容: 我有一个UILabel,一个UIView在情节提要中并排包含其他子视图。UIView应该紧靠UILabel的右边缘(跟踪约束为1),但我还需要UIlabel(左侧的UIlabel)将其宽度设置为等于其内容大小,除非它达到最大宽度。视觉上: |标签文字| | UIViewWithSubviews | 我需要以下约束: 1)标签应明智地调整宽度大小,除非达到最大大小,并且高度也是动态的,这