【发布时间】:2017-04-18 10:11:23
【问题描述】:
为了产生与 Snapchat 的 HUD 运动类似的效果,我创建了一个基于 UIScollView's contentOffset 的 HUD 元素的运动。 编辑:Link to the Github project。
func scrollViewDidScroll(_ scrollView: UIScrollView) {
self.view.layoutIfNeeded()
let factor = scrollView.contentOffset.y / self.view.frame.height
self.transformElements(self.playButton,
0.45 + 0.55 * factor, // 0.45 = desired scale + 0.55 = 1.0 == original scale
Roots.screenSize.height - 280, // 280 == original Y
Roots.screenSize.height - 84, // 84 == minimum desired Y
factor)
}
func transformElements(_ element: UIView?,
_ scale: CGFloat,
_ originY: CGFloat,
_ desiredY: CGFloat,
_ factor: CGFloat) {
if let e = element {
e.transform = CGAffineTransform(scaleX: scale, y: scale) // this line lagging
let resultY = desiredY + (originY - desiredY) * factor
var frame = e.frame
frame.origin.y = resultY
e.frame = frame
}
}
使用此代码实现的滚动以及过渡似乎“滞后”/不平滑。 (实体版 iPhone 6S+ 和 7+)。
删除以下行:e.transform = CGAffineTransform(scaleX: scale, y: scale) 消除了问题。 UIView 对象的滚动以及Y-movement 再次平滑。
转换对象比例的最佳方法是什么?
没有布局约束。
func setupPlayButton() {
let rect = CGRect(x: Roots.screenSize.width / 2 - 60,
y: Roots.screenSize.height - 280,
width: 120,
height: 120)
self.playButton = UIButton(frame: rect)
self.playButton.setImage(UIImage(named: "playBtn")?.withRenderingMode(.alwaysTemplate), for: .normal)
self.playButton.tintColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
self.view.addSubview(playButton)
}
【问题讨论】:
-
你的按钮有透明背景吗?如果是这样,您可以将其关闭并重试吗?您也可以在制作动画时尝试
button.layer.shouldRasterize = true。 -
按钮没有颜色。只是一个 UIImage(带有透明元素的 pdf)
-
从您的 gif 中,尝试将背景设置为黑色。
-
layer.shouldRasterize = true= 仍然滞后。让我检查 BG。秒 -
backgroundColor = .black= 仍然滞后
标签: swift uiview uiscrollview