代码之家  ›  专栏  ›  技术社区  ›  user4487951

动画[tableView reloadData]

  •  7
  • user4487951  · 技术社区  · 11 年前

    我有一个 UITableViewCell 它在单击时展开并添加标签。

    逻辑:

    我在中添加了标签 cellForRowAtIndexPath 到所选单元格,以及 在里面 didSelectRow... 我重新加载了tableView。在里面 heightForRow... 这个 所选单元格展开。希望你能拿到照片。

    在里面 didSelectRow。。。 我必须重新加载数据,而不是开始/结束更新。我想做的是重新加载数据并使其动画化。我可以这样做:

    [UIView transitionWithView: tableView
                      duration: 0.40f
                       options: UIViewAnimationOptionTransitionCrossDissolve
                    animations: ^(void)
     {
       [self.tableView reloadData];
     }
                    completion: nil
     }];
    

    因此,细胞的交叉溶解正在发生变化。我想要的是 UITableViewRowAnimationTop ,但显然这在过渡选项中是不可能的。有没有办法 reloadData 和使用 UITableViewRowAnimationTop ?

    5 回复  |  直到 11 年前
        1
  •  9
  •   brandonscript    8 年前

    一个简单得多的解决方案,不需要CoreAnimation。

    斯威夫特3:

    UIView.transition(with: self.view,
                      duration: 0.15,
                      options: [.curveEaseInOut, .transitionCrossDissolve],
                      animations: {
                          self.tableView.reloadRows(at: self.tableView.indexPathsForVisibleRows!, with: .none)
    }, completion: nil)
    
        2
  •  8
  •   Ozgur Vatansever    8 年前

    [UITablewView reloadData:] 不可设置动画。但是,您可能需要尝试通过重新加载带有动画的所有部分来重新加载tableView。

    NSIndexSet *sections = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [tableView numberOfSections])];
    
    [self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationAutomatic];
    

    好吧,我撒谎了。它可能是可动画的,但它需要很多关于如何 QuartzCore Framework 操作UI组件。

    @import QuartzCore;
    

    [self.tableView reloadData];
    
    CATransition *transition = [CATransition animation];
    transition.type = kCATransitionPush;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.fillMode = kCAFillModeForwards;
    transition.duration = 0.6;
    transition.subtype = kCATransitionFromTop;
    
    [self.tableView.layer addAnimation:transition forKey:@"UITableViewReloadDataAnimationKey"];
    
        3
  •  2
  •   koen    5 年前

    斯威夫特4 解决方案 石英岩心

    import QuartzCore
    

    tableView.reloadData()
    
    let transition = CATransition()
    transition.type = kCATransitionPush
    transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
    transition.fillMode = kCAFillModeForwards
    transition.duration = 0.6
    transition.subtype = kCATransitionFromBottom
        
    tableView.layer.add(transition, forKey: "UITableViewReloadDataAnimationKey")
    

    雨燕5

    tableView.reloadData()
    let transition = CATransition()
    transition.type = .push
    transition.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)
    transition.fillMode = .forwards
    transition.duration = 0.6
    transition.subtype = .fromBottom
    
        4
  •  1
  •   Simon Tillson    9 年前

    或者这个:

        NSIndexSet *sections = [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [self numberOfSectionsInTableView: self.tableView])];
        [self.tableView reloadSections: sections withRowAnimation: UITableViewRowAnimationTop];
    

    就个人而言,我认为UITableViewRowAnimationFade看起来更好。

        5
  •  0
  •   budiDino    8 年前

    UITableView扩展适用于Swift 4:

    extension UITableView {
      func reloadDataWithAnimation(duration: TimeInterval, options: UIViewAnimationOptions) {
        UIView.animate(withDuration: duration, delay: 0.0, options: options, animations: { self.alpha = 0 }, completion: nil)
        self.reloadData()
        UIView.animate(withDuration: duration, delay: 0.0, options: options, animations: { self.alpha = 1 }, completion: nil)
      }
    }
    

    用法:

    tableView.reloadDataWithAnimation(duration: 1.0, options: .curveLinear)