动画UITableViewHeader增长/缩小

时间:2013-12-11 16:55:06

标签: ios objective-c animation

我是iOS新手,我试图找出如何为tableView标题设置动画,使其看起来像从视图顶部向下滑动,在那里停留3秒钟,然后向上滑动并消失。

我之前没有做过任何动画,所以我真的可以使用一些帮助。我不知道从哪里开始。我看过这里的其他答案,但似乎无法弄清楚如何做到这一点。

我的表格视图在我的UITableViewController类的viewDidLoad中显示得很好

self.headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320,15)];

self.headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 15)];

self.headerLabel.textAlignment = NSTextAlignmentCenter;

self.headerLabel.text = @"some text";

[self.headerView addSubview:self.headerLabel];

self.tableView.tableHeaderView = self.headerView;

self.tableView.tableHeaderView.frame = CGRectMake(0, 0, 320, 15);

我认为我需要为框架的高度设置动画。

编辑:我发现这个代码似乎应该可以工作,但是当动画运行时它会崩溃我的应用程序

- (void)viewDidAppear:(BOOL)animated {

    [super viewDidAppear:animated];
    [UIView animateWithDuration:3.0f
                      delay:0.0f
                    options: UIViewAnimationOptionBeginFromCurrentState
                 animations:^{
                     self.headerView.frame = CGRectMake(0.0f, 0.0f, 320.f, 0.0f);
                 }
                 completion:^(BOOL finished) {
                     [self.tableView scrollToRowAtIndexPath:[NSIndexPath     indexPathForItem:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
                 }];

}

2 个答案:

答案 0 :(得分:0)

我不知道您是否可以像想要的那样为表格视图的标题视图设置动画。对于像Table视图这样复杂的UI对象,Apple倾向于将构成对象的视图视为私有,并且当您尝试操作视图层次结构时,往往会发生不良事件。

如果您没有使用自动布局,并且想要为属于您的视图层次结构的另一个视图设置动画,那么您的代码可能就像这样简单:

CGPoint center = myView.center;
CGFloat myViewBottom = myView.frame.origin.y + myView.frame.origin.size.height;

//Move the view above the top of it's superview before starting the animation.
center.y -= myViewBottom; 

//Animate the view down into position
[UIView animateWithDuration: .2
  animations:
  ^{
     myView.center += myViewBottom;
   };
  completion: 
  ^{
      //As the completion block for the first animation, trigger another 
      //animation to animate the view away again. This time delay 
      //for 3 second before the 2nd animation.
      [UIView animateWithDuration: .2
      delay: 3.0
      options: 0
      animations: 
      ^{
         myView.center -= myViewBottom;
       };
      completion: nil
  }
];

答案 1 :(得分:0)

尝试使用beginUpdates和endUpdates,这是一个例子:

标题中的

@property NSInteger newOffset;

实现:

- (void) colapseHeader
{
    _newOffset = 50;
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return 50 + _newOffset;
}

- (void) viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    _newOffset = 100;
    [self.tableView beginUpdates];
    [self.tableView endUpdates];
    [self performSelector:@selector(colapseHeader) withObject:nil afterDelay:3];
}