淡入淡出UIScrollView的内容,就像Mobile Safari在其选项卡中所做的那样

dig*_*dog 13 iphone cocoa-touch core-animation objective-c uiscrollview

注意:我在下面的UPDATE答案中添加了我的新解决方案.

我尝试重新创建我们在iPhone/iPod touch上的Mobile Safari选项卡中看到的效果.

基本上,它是一个UIScrollView,它包含4个可重用的UIView(就像环形缓冲区一样),并且水平滚动.滚动时,UIView的不透明度将与偏移无缝淡入/淡出.

目前,我做了所有肮脏的工作- (void)scrollViewDidScroll:(UIScrollView *)scrollView.例如从UIScrollView获取contentOffset,确定pageingation,计算contentOffset和每个UIView位置之间的差值,并在scrollViewDidScroll:调用时确定/设置每个UIView的alpha值.

它工作正常,性能还可以,一切运行顺利,但唯一的问题是计算太多.

我试过的UIView的beginAnimations:commitAnimations:,但它是无用scrollViewDidScroll:的,因为1)新的阿尔法值还是要由我自己来计算,和2)scrollViewDidScroll:滚动时不停叫,这是毫无意义的,在这里做动画.有没有办法用Core Animation重写这个部分?因此,我不必自己对每个UIView的alpha值进行数学计算,相反,我可以将整个作品留给Core Animation.

dig*_*dog 26

UPDATE

我想出了另一种更新每个页面的alpha值的方法.在创建内容视图时,我使用KVO将addObserver与UIScrollView的contentOffset一起使用:

[self.scrollView addObserver:[self.contentViews objectAtIndex:i] 
                  forKeyPath:@"contentOffset" 
                     options:NSKeyValueObservingOptionNew
                     context:@selector(updateAlpha:)];
Run Code Online (Sandbox Code Playgroud)

因此,当contentOffset发生更改时,我的每个contentView都会收到消息:

- (void)observeValueForKeyPath:(NSString *)keyPath 
                      ofObject:(id)object 
                        change:(NSDictionary *)change 
                       context:(void *)context {
    [self performSelector:(SEL)context withObject:change];
}
Run Code Online (Sandbox Code Playgroud)

我的contentViews可以在滚动时自行进行计算和动画处理:

- (void)updateAlpha:(NSDictionary *)change {
    CGFloat offset = [[change objectForKey:NSKeyValueChangeNewKey] CGPointValue].x;
    CGFloat origin = [self frame].origin.x;
    CGFloat delta = fabs(origin - offset);

    [UIView beginAnimations:@"Fading" context:nil];
    if (delta < [self frame].size.width) {
        self.alpha = 1 - delta/self.frame.size.width*0.7;
    } else {
        self.alpha = 0.3;
    }
    [UIView commitAnimations];
}
Run Code Online (Sandbox Code Playgroud)

当然,您需要在从superview中删除内容视图时删除观察者,并在创建新内容视图时再次添加它们.

希望这对那些想要做同样事情的人有所帮助.