ios - 在 View 大小更改时更改 UIView 阴影大小会产生奇怪的效果

标签 ios swift

我有一个 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

enter image description here

我希望有一种方法可以让我在没有这种奇怪行为的情况下工作,我对 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/

相关文章:

ios - 在 ios 上使用不受信任的证书加密数据

ios - 从 NSArray 中提取数据

ios - 如何对字典类型中的特定值求和

ios - 如何在 SpriteKit 场景编辑器中访问 Navigation Graph 的对象

ios - 如何阻止 iAds 在 xcode 中扭曲 SKScene?

ios - 只使用实例变量而不使用属性可以吗

ios - 两个类,回调和单元测试

ios - 使用 Interface Builder/Storyboards 中的自动布局创建网格类型布局

ios - 获取 CGRects 的 UIView 类的尺寸?

swift - 如何将一个 Cocoa 应用程序嵌入另一个 Cocoa 应用程序并将其作为子进程启动