我按照本教程http://blog.matthewcheok.com/design-teardown-stretchy-headers/制作了一个弹性标题。无论如何它的工作完美但我无法在它上面制作UIView,因为视图拉伸并返回到原始alpha,因为视图恢复正常。我能想出的最好的是:
override func
scrollViewDidScroll(scrollView: UIScrollView) {
updateHeaderView()
var offset = scrollView.contentOffset.y
if offset < -170 {
headerBlurImageView?.alpha = max(0.0, offset - 95/35)
} else {
self.headerBlurImageView?.alpha = 1
}
}
但它几乎没有用。 alpha之间没有平滑过渡,当视图恢复正常时,alpha不会返回。有什么建议或提示吗?
更新:我设法与我想要的完全相反:p这是代码:
override func scrollViewDidScroll(scrollView: UIScrollView) {
updateHeaderView()
var height: CGFloat
var position: CGFloat
var percent: CGFloat
height = scrollView.bounds.size.height/2
position = max(-scrollView.contentOffset.y, 0.0)
percent = min(position / height, 1.0)
self.headerBlurImageView.alpha = percent
}
答案 0 :(得分:2)
查看UIScrollViewDelegate协议。有许多消息与开始和结束拖动和减速有关。您应该能够将视图控制器设置为滚动视图的委托并实现其中一些方法。我会创建一个UIView动画,在滚动开始时动画显示标题的alpha,以及另一个UIView动画,一旦滚动结束(或者可能一旦减速结束),它就会将动画恢复为不透明。
答案 1 :(得分:0)
将两个UIImageViews相互叠加(在本例中,bg位于bgB下),然后将UIScrollview布置在最顶层。在scrollviewDidScroll方法中,放置以下代码:
float off = cv.contentOffset.x;
float floatedIndex = off/cv.frame.size.width;
int left = floatedIndex;
int right = ceil(floatedIndex);
if (right>events.count-1){ right=events.count-1; }
float alpha = floatedIndex-left;
UIImage * leftImage = nil;
UIImage * rightImage = nil;
NSDictionary * ld = events[left];
NSDictionary * rd = events[right];
NSObject * o = ld[@"artwork"];
if ([o isKindOfClass:[UIImage class]]){
leftImage = ld[@"artwork"];
}
o = rd[@"artwork"];
if ([o isKindOfClass:[UIImage class]]){
rightImage = rd[@"artwork"];
}
bg.image = leftImage;
bgB.image = rightImage;
bgB.alpha = alpha;
&#39;离开&#39;并且&#39;对&#39; int对应于数组中的索引。有一行检查滚动视图不会意外地走得太远了#39;即试图找到数组边界之外的索引。
然后我从一个名为events的数组中提取数据,并检查结果字典中是否存在图像(但你可以将它用于一个直接的图像数组),更新UIImageviews然后褪色顶部(bgB)的输入和输出取决于滚动的内容偏移量。
动画&#39;与用户交互相关,这很好,但有时候使用另一个scrollview委托方法的动画块会更好。