上面的代码很好,清晰,简单,只用于滚动标题。
但是如果你想制作一个和 Twitter 一样的视图,你可以使用这个教程:
http://www.thinkandbuild.it/implementing-the-twitter-ios-app-ui/
本教程用swift实现。
您可以点击本教程末尾的“下载源代码”按钮下载源代码。
或者直接去github:
https://github.com/ariok/TB_TwitterUI
下面我们将解释如何实现scrollViewDidScroll功能:
1- 这些是 scrollViewDidScroll 函数的第一行:
var offset = scrollView.contentOffset.y
var avatarTransform = CATransform3DIdentity
var headerTransform = CATransform3DIdentity
这里我们获取当前的垂直偏移量,并初始化两个转换,稍后我们将使用此函数设置。
2- 管理下拉动作
if offset < 0 {
let headerScaleFactor:CGFloat = -(offset) / header.bounds.height
let headerSizevariation = ((header.bounds.height * (1.0 + headerScaleFactor)) - header.bounds.height)/2.0
headerTransform = CATransform3DTranslate(headerTransform, 0, headerSizevariation, 0)
headerTransform = CATransform3DScale(headerTransform, 1.0 + headerScaleFactor, 1.0 + headerScaleFactor, 0)
header.layer.transform = headerTransform
}
3- 管理向上/向下滚动
else{
// Header -----------
headerTransform = CATransform3DTranslate(headerTransform, 0, max(-offset_HeaderStop, -offset), 0)
// ------------ Label
let labelTransform = CATransform3DMakeTranslation(0, max(-distance_W_LabelHeader, offset_B_LabelHeader - offset), 0)
headerLabel.layer.transform = labelTransform
// ------------ Blur
headerBlurImageView?.alpha = min (1.0, (offset - offset_B_LabelHeader)/distance_W_LabelHeader)
// Avatar -----------
let avatarScaleFactor = (min(offset_HeaderStop, offset)) / avatarImage.bounds.height / 1.4 // Slow down the animation
let avatarSizeVariation = ((avatarImage.bounds.height * (1.0 + avatarScaleFactor)) - avatarImage.bounds.height) / 2.0
avatarTransform = CATransform3DTranslate(avatarTransform, 0, avatarSizeVariation, 0)
avatarTransform = CATransform3DScale(avatarTransform, 1.0 - avatarScaleFactor, 1.0 - avatarScaleFactor, 0)
if offset <= offset_HeaderStop {
if avatarImage.layer.zPosition < header.layer.zPosition{
header.layer.zPosition = 0
}
}else {
if avatarImage.layer.zPosition >= header.layer.zPosition{
header.layer.zPosition = 2
}
}}
4- 应用转换
header.layer.transform = headerTransform
avatarImage.layer.transform = avatarTransform