如何制作动画的UITableView头视图(How to animate UITableView h

2019-09-02 20:30发布

我需要动画一个的tableview头视图的插入。 我想的是,表中的行滑下而头部视图扩展其帧。
到目前为止,我得到了最好的结果是使用下面的代码:

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

这种解决方案的问题在于,它本身没有得到动画片头,它的框架不会扩大。

所以我得到的效果是,表中的行滑下(我想),但头视图会立即显示,我希望它扩大它的帧动画。

有任何想法吗?

谢谢。

Answer 1:

有头帧在CGRectZero并使用动画设置其帧

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

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

[self.tableView endUpdates];  


Answer 2:

下面是我得到了在斯威夫特工作,以零初始帧的高度和更新它在动画关闭其全高:

// 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
})


Answer 3:

所选择的答案并没有为我工作。 必须做到以下几点:

[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;
                   }];

真正奇怪的是,这部作品在一个视图中,但不是在同一个视图控制器/视图层次的子类。



Answer 4:

我找到了明确的和适当的方式来实现一个真正的动画tableHeaderView小号!

•首先,如果你是Autolayout ,保持Margin系统您的标题视图中。 和Xcode 8日现在可以(在最后!),只是不作出任何限制设置为任何标题子视图。 你必须设置认为正确的页边距。

•然后使用beginUpdatesendUpdates ,而是把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:头本身并没有改变其高度,但头部子视图似乎移动,就好像头范围发生变化。



Answer 5:

SWIFT 4溶液W /不同的头

如果你想这样的动画,这是我所使用的解决方案:(即使在我的情况我也玩了一下与对象的不透明度,因为我是加载另一个完全不同的头)

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关闭。 所述beging /结束的更新是必要的,以便移动和更新的tableView的其它元件。



Answer 6:

使用下面这个代码工作

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
    })
   }
}


文章来源: How to animate UITableView header view