gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:19:59 25 4
gpt4 key购买 nike

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

我尝试重现我们在 iPhone/iPod touch 上的 Mobile Safari 选项卡中看到的效果。

基本上,它是一个 UIScrollView,包含 4 个可重用的 UIView(类似于环形缓冲区),并且可以水平滚动。滚动时,UIView 的不透明度将随着偏移量无缝淡入/淡出。

目前,我在 - (void)scrollViewDidScroll:(UIScrollView *)scrollView 中完成所有脏活。例如从 UIScrollView 获取 contentOffset,判断分页,计算 contentOffset 与每个 UIView 位置之间的差值,以及在调用 scrollViewDidScroll: 时决定/设置每个 UIView 的 alpha 值。

而且还行,性能还可以,一切都运行的很顺利,唯一的问题就是计算量太大了。

我尝试了 UIView 的 beginAnimations:commitAnimations:,但它在 scrollViewDidScroll: 中没用,因为 1) 新的 alpha 值仍然必须自己计算, 2) scrollViewDidScroll: 滚动时一直调用,这里做动画没有意义。有什么办法可以用Core Animation重写这部分吗?所以我不必自己计算每个 UIView 的 alpha 值,相反,我可以将整个工作留给 Core Animation。

最佳答案

更新

我想出了另一种方法来更新每个页面的 alpha 值。创建内容 View 时,我使用 KVO 来添加带有 UIScrollView 的 contentOffset 的观察者:

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

这样我的每个 contentView 都会在 contentOffset 更改时收到消息:

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

我的 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];
}

当然,当你从 superview 中删除内容 View 时,你需要删除观察者,并在创建新内容 View 时再次添加它们。

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

关于objective-c - 淡入/淡出 UIScrollView 的内容,就像 Mobile Safari 在其选项卡中所做的那样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/875129/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com