【发布时间】:2014-07-28 06:57:10
【问题描述】:
我想知道如何实现类似于雅虎新闻文摘应用的视差滚动。其中,当用户水平滚动时,背景图像以不同的速度滚动并启用分页。
可能是他们使用带有背景视图的 ScrollView 来做到这一点。不完全确定。实现这种滚动的提示会很棒。我检查了类似的问题,但找不到我正在寻找的答案。
【问题讨论】:
-
Yahoo 应用实际滚动效果是否不同。
我想知道如何实现类似于雅虎新闻文摘应用的视差滚动。其中,当用户水平滚动时,背景图像以不同的速度滚动并启用分页。
可能是他们使用带有背景视图的 ScrollView 来做到这一点。不完全确定。实现这种滚动的提示会很棒。我检查了类似的问题,但找不到我正在寻找的答案。
【问题讨论】:
我之前用 2 个滚动视图完成了此操作。
你有主要的细节滚动视图,然后是它后面的视差滚动视图(或任何你想要的地方)。
然后你成为详细滚动视图的代表。
在scrollView:didScroll方法中,你可以调整视差视图的滚动。
如果你只是在做 x 轴,那么你想要这样的东西......
CGFloat detailMaxOffset = self.detailScrollView.contentSize.width - CGRectGetWidth(self.scrollView.frame);
CGFloat percentage = self.detailScrollView.contentOffset.x / maxOffset;
CGFloat parallaxMaxOffset = self.parallaxScrollView.contentSize.width - CGRectGetWidth(self.parallaxScrollView.frame);
[self.parallaxScrollView setContentOffset:CGPointMake(percentage * parallaxOffset, 0);
这会将滚动视图的内容偏移“百分比”设置为相同。
要获得视差效果,您只需使每个滚动视图的contentSize 不同。
如果视差滚动视图的内容大小比细节滚动视图大,它将滚动得更快。如果它的内容尺寸较小,滚动速度会变慢。
【讨论】:
这就是答案。我从 uitableview 子类化它,以便数据可以重用并将其包装在 uiview 中。 https://github.com/michaelhenry/MHYahooParallaxView
谢谢, 凯尔
【讨论】:
100% 工作且易于筑坝
在 imageview 上查看图像视图的大小。 默认情况下,视图集 0 的 alpha。
//MARK: Scroll View Delegate methods
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
NSLog(@"X: %f Y: %f",scrollView.contentOffset.x,scrollView.contentOffset.y);
CGFloat scrollY = _mainScrollView.contentOffset.y;
CGFloat height = _alphaView.frame.size.height;
CGFloat alphaMonitor = scrollY/height;
_alphaView.alpha = alphaMonitor;
}
【讨论】:
斯威夫特 3
以下是我如何在 Swift 3 中为 tvOS 应用程序中的垂直滚动获得视差效果。
在 ViewDidLoad() 中:
parallaxScrollView.delegate = self
detailScrollView.delegate = self
以下:
override func viewDidLayoutSubviews() {
self.detailScrollView!.contentSize = CGSize(width: 1920, height: 2700)
self.parallaxScrollView?.contentSize = CGSize(width: 1920, height: 3000)
}
//// THE SCROLL VIEW
func scrollViewDidScroll(_ scrollView: UIScrollView) {
// Parallax effect
let detailMaxOffset = self.detailScrollView.contentSize.height - self.detailScrollView.frame.height;
let percentage = self.detailScrollView.contentOffset.y / detailMaxOffset
let parallaxMaxOffset = self.parallaxScrollView.contentSize.height - self.parallaxScrollView.frame.height;
let parallaxOffset = CGPoint(x:0,y:(percentage * parallaxMaxOffset))
self.parallaxScrollView.setContentOffset((parallaxOffset), animated: false)
}
【讨论】: