我有一个 View ,上面有一个平移手势识别器,可以在您向上或向下滑动时增加 View 的整体高度。这目前效果很好,但我还想添加一个我设计的投影,并确保它与不断变化的可拖动 View 的高度保持一致。然而,这会产生一些奇怪的效果,我想看看是否有办法解决这个问题
处理改变 View 高度和阴影高度的相关代码如下
// SET SHADOW FOR DRAGABLE VIEW PATH IN VIEW DID LOAD
draggableView.layer.shadowColor = UIColor.black.cgColor
draggableView.layer.shadowOffset = CGSize(width: 0, height: 12)
draggableView.layer.shadowOpacity = 0.33
draggableView.layer.shadowRadius = 8
draggableView.layer.shadowPath = UIBezierPath(roundedRect:
draggableView.bounds, cornerRadius: 12).cgPath
// INSIDE THE RECOGNIZER HANDLER
if recognizer.state == .began || recognizer.state == .changed {
translation = recognizer.translation(in: self.view)
recognizer.setTranslation(CGPoint(x: 0.0, y: 0.0), in: self.view)
let endPosition = recognizer.location(in: draggableView) // the posiion at which PanGesture Ended
difference = endPosition.y - startPosition.y
var newFrame = draggableView.frame
newFrame.origin.x = draggableView.frame.origin.x
newFrame.origin.y = draggableView.frame.origin.y + difference
// HERE WE SET THE HEIGHT OF THE VIEW THAT IS BEING "DRAGGED"
newFrame.size.height = draggableView.frame.size.height - difference
// HERE WE UPDATE THE SHADOW PATH WITH THE NEW DRAGGABLE VIEW BOUNDS
draggableView.layer.shadowPath = UIBezierPath(roundedRect: draggableView.bounds, cornerRadius: 12).cgPath
draggableView.frame = newFrame
}
我得到的效果是阴影没有随着当前的平移手势及时更新,这是一个看起来像的 gif
我希望有一种方法可以让我在没有这种奇怪行为的情况下工作,我对 swift 还很陌生,虽然我理解这些概念,但更多的是不知道所有最好的做事方式
最佳答案
下面两行代码的顺序需要倒过来
draggableView.layer.shadowPath = UIBezierPath(roundedRect: draggableView.bounds, cornerRadius: 12).cgPath
draggableView.frame = newFrame
原因是您正在 PanGesture 委托(delegate)方法中更新 draggableView
的位置(框架)。但是,在更新可拖动 View (第 2 行)的位置(框架)之前,您正在更新阴影框架(第 1 行)。所以,反转两条线对你有用
建议:
在您的例子中,您正在更新两个 View (可拖动和阴影)的框架。我们可以看到 CPU 正在努力尝试更新它们,因为它滞后(特别是在阴影部分,因为您正在重新绘制它。)
我的建议是您可以创建一个父级透明 View 并将当前的可拖动 View 放入其中并绘制阴影。这只会在您的 viewDidLoad
中发生一次。然后在手势删除中,你只会更新父 View 的框架。这样就不需要每次都更新阴影,拖动会更流畅
关于ios - 在 View 大小更改时更改 UIView 阴影大小会产生奇怪的效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50275027/