14

我需要为 tableview 标题视图的插入设置动画。我希望表格行在标题视图展开其框架时向下滑动。
到目前为止,我得到的最好结果是使用以下代码:

[self.tableView beginUpdates];  
[self.tableView setTableHeaderView:self.someHeaderView];  
[self.tableView endUpdates];

这个解决方案的问题是标题本身没有动画,它的框架没有扩展。

所以我得到的效果是表格行向下滑动(如我所愿)但标题视图立即显示,我希望它用动画扩展它的框架。

有任何想法吗?

谢谢。

4

8 回答 8

26

将标题框架设置在CGRectZero 并使用动画设置其框架

[self.tableView beginUpdates];  
[self.tableView setTableHeaderView:self.someHeaderView];  

[UIView animateWithDuration:.5f animations:^{
  CGRect theFrame = someBigger.frame;
  someHeaderView.frame = theFrame;
}];

[self.tableView endUpdates];  
于 2013-05-13T09:26:03.383 回答
17

以下是我在 Swift 中的工作,初始帧高度为零,并在动画闭包中将其更新为全高:

// Calculate new frame size for the table header
var newFrame = tableView.tableHeaderView!.frame
newFrame.size.height = 42

// Get the reference to the header view
let tableHeaderView = tableView.tableHeaderView

// Animate the height change
UIView.animate(withDuration: 0.6) {
    tableHeaderView.frame = newFrame
    self.tableView.tableHeaderView = tableHeaderView
})
于 2015-08-26T13:56:38.353 回答
7

选择的答案对我不起作用。必须执行以下操作:

[UIView animateWithDuration: 0.5f
                 animations: ^{
                     CGRect frame = self.tableView.tableHeaderView.frame;
                     frame.size.height = self.headerViewController.preferredHeight;
                     self.tableView.tableHeaderView.frame = frame;
                     self.tableView.tableHeaderView = self.tableView.tableHeaderView;
                   }];

真正奇特的部分是,这适用于一个视图,但不适用于同一视图控制器/视图层次结构的子类。

于 2015-08-09T18:08:08.553 回答
1

tableHeaderView我找到了在s!上实现真实动画的明确且正确的方法!

• 首先,如果您在 中Autolayout,请将Margin系统保留在标题视图中。有了 Xcode 8,它现在成为可能(终于!),只是不要对任何标题子视图设置任何约束。您必须设置正确的边距。

• 然后使用beginUpdatesand endUpdates,但放入endUpdate 动画块中。

// [self.tableView setTableHeaderView:headerView]; // not needed if already there
[self.tableView beginUpdates]; 
CGRect headerFrame = self.tableView.tableHeaderView.bounds;
headerFrame.size.height = PLAccountHeaderErrorHeight;

[UIView animateWithDuration:0.2 animations:^{
    self.tableView.tableHeaderView.bounds = headerFrame;

    [self.tableView endUpdates];
}];

注意:我只在 iOS10 中尝试过,我会在下载 iOS9 模拟器时发布更新。

编辑

不幸的是,它在 iOS9 和 iOS10 中都不起作用:标题本身不会改变它的高度,但是标题子视图似乎会移动,就好像标题边界发生了变化一样。

于 2016-09-16T14:38:48.440 回答
1

带有不同标题的 SWIFT 4 解决方案

如果你想要这种动画,这就是我使用的解决方案:(即使在我的情况下,我还必须对对象的不透明度进行一些处理,因为我正在加载另一个完全不同的标题)

fileprivate func transitionExample() {

    let oldHeight = tableView.tableHeaderView?.systemLayoutSizeFitting(UILayoutFittingCompressedSize).height ?? 0

    let newHeader = YourCustomHeaderView()
    newHeader.hideElements() // If you want to play with opacity.

    let smallHeaderFrame = CGRect(x: 0, y: 0, width: newHeader.frame.width, height: oldHeight)
    let fullHeaderFrame = newHeader.frame

    newHeader.frame = smallHeaderFrame

    UIView.animate(withDuration: 0.4) { [weak self] in
        self?.tableView.beginUpdates()
        newHeader.showElements() // Only if have hided the elements before.
        self?.tableView.tableHeaderView = newHeader
        self?.tableView.tableHeaderView?.frame = fullHeaderFrame
        self?.tableView.endUpdates()
    }
}

所以,基本上,这都是关于改变.animate封闭内部的框架。为了移动和更新 tableView 的其他元素,需要开始/结束更新。

于 2018-07-24T07:33:13.127 回答
1

这是一个 Swift 5 UITableView 扩展,用于更改 headerView 或更改其高度,使用 AutoLayout 进行动画处理

extension UITableView {

func animateTableHeader(view: UIView? = nil, frame: CGRect? = nil) {
    self.tableHeaderView?.setNeedsUpdateConstraints()
    UIView.animate(withDuration: 0.2, animations: {() -> Void in
        let hView = view ?? self.tableHeaderView
        if frame != nil {
            hView?.frame = frame!
        }
        self.tableHeaderView = hView
        self.tableHeaderView?.layoutIfNeeded()
    }, completion: nil)
}

}

于 2019-07-25T22:31:52.943 回答
0

对我来说,在没有任何明确的动画块或操作帧的情况下使用自动布局时它是动画的。

// `tableHeaderViewHeight` is a reference to the height constraint of `tableHeaderView`
tableHeaderViewHeight?.constant = .leastNormalMagnitude

tableView.beginUpdates()
tableView.tableHeaderView = tableHeaderView
tableHeaderView.layoutIfNeeded()
tableView.endUpdates()
于 2022-03-02T15:33:26.220 回答
-1

使用下面的代码这有效

extension UITableView {

 func hideTableHeaderView() -> Void {
    self.beginUpdates()
    UIView.animate(withDuration: 0.2, animations: {
        self.tableHeaderView = nil
    })
    self.endUpdates()
}

func showTableHeaderView(header: UIView) -> Void {
    let headerView = header
    self.beginUpdates()
    let headerFrame = headerView.frame
    headerView.frame = CGRect()
    self.tableHeaderView = headerView
    UIView.animate(withDuration: 0.2, animations: {
        self.tableHeaderView?.frame = headerFrame
        self.tableHeaderView?.alpha = 0
        self.endUpdates()
    }, completion: { (ok) in
        self.tableHeaderView?.alpha = 1
    })
   }
}
于 2017-10-10T11:35:07.580 回答