要對Snapchat的HUD運動產生類似的效果,我創建了基於UIScollView's
contentOffset
的HUD元素的運動。 編輯:Link to the Github project。如何在UIScrollView運動中正確轉換UIView的縮放比例
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
}
}
使用此代碼實現滾動以及過渡似乎是「laggy」/不光滑。 (物理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'。 – dmorrow
該按鈕沒有顏色。只是一個UIImage(pdf與透明元素) –
從你的gif,嘗試設置背景黑色。 – dmorrow