【问题标题】:Update shadow path on device rotation change. Problem with shadow更新设备旋转更改的阴影路径。阴影问题
【发布时间】:2019-03-21 09:44:30
【问题描述】:

我有一个包含其他视图的视图。 ViewforShadow -> View-> bottomBlueView

func setupMyView() {

    myView.layer.shadowColor = #colorLiteral(red: 0.2901960784, green: 0.2901960784, blue: 0.2901960784, alpha: 1)
    myView.layer.shadowOffset = CGSize.zero
    myView.layer.shadowRadius = 4
    myView.layer.shadowOpacity = 1
    myView.layer.masksToBounds = false
    myView.layer.shadowPath = UIBezierPath(roundedRect: myView.bounds, cornerRadius: myView.frame.height / 10).cgPath
    myView.layer.backgroundColor = UIColor.clear.cgColor

}

每当我旋转我的设备时,我都会看到这个看起来很奇怪的阴影

我了解此问题的发生是因为 shadow 具有纵向/横向模式的 myView.bounds。所以每当我旋转我的设备时,我都需要更改它。 我发现 viewWillLayoutSubviews() 和 viewDidLayoutSubviews() 是很好的函数来解决我的问题。

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    //update shadow
    myView.layer.shadowPath = UIBezierPath(roundedRect: myView.bounds, cornerRadius: myView.frame.height / 10).cgPath

}

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    //update shadow
    myView.layer.shadowPath = UIBezierPath(roundedRect: myView.bounds, cornerRadius: myView.frame.height / 10).cgPath

}

我两种都试过了,效果很好,但是每当我旋转我的设备大约 1 秒钟时,就会出现这个故障阴影(我不喜欢它)。 1秒后

编辑 我决定创建一个新的空白项目,看看为什么它不起作用。我的视图控制器和这段代码中有 1 个 UIView。

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var myView: UIView!
override func viewDidLoad() {
    super.viewDidLoad()

    setupMyView()
}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    //update shadow
    myView.frame = myView.frame
    myView.layer.shadowPath = UIBezierPath(roundedRect: myView.bounds, cornerRadius: myView.frame.height / 10).cgPath

}

func setupMyView() {
    myView.layer.shadowColor = #colorLiteral(red: 0.2745098174, green: 0.4862745106, blue: 0.1411764771, alpha: 1)
    myView.layer.shadowOffset = CGSize.zero
    myView.layer.shadowRadius = 4
    myView.layer.shadowOpacity = 1
    myView.layer.masksToBounds = false
    myView.layer.shadowPath = UIBezierPath(roundedRect: myView.bounds, cornerRadius: myView.frame.height / 10).cgPath
 //   myView.layer.backgroundColor = UIColor.clear.cgColor
}

} 当你旋转设备时,阴影不在正确的位置。

1 秒后它看起来不错(正常状态)

【问题讨论】:

  • 嗨!似乎问题不在于阴影。我想你有一些在主线程中执行的繁重功能。您能否提供更多有关您的 ViewController 中发生的事情的信息。
  • 我正在使用 mapKit 并在地图上显示用户位置。这个主视图控制器正在使用地图,这个底部视图带有一个按钮(蓝色条)来停止显示位置。
  • 好的。你有一些关于调试终端布局问题的消息吗?我已经创建了类似的功能并且没有问题。
  • 终端中没有错误或问题。不知道为什么会这样。
  • 抱歉,如果没有更多详细信息(源代码),很难找到问题所在。您可以尝试逐步禁用 ViewController 的功能并调查问题状态。

标签: ios swift xcode uibezierpath layoutsubviews


【解决方案1】:

您可以尝试以这种方式设置 ViewForShadow:

在 ViewController 中:

    fileprivate func setupMyView() {
        viewForShadow.layer.shadowColor = #colorLiteral(red: 0.2901960784, green: 0.2901960784, blue: 0.2901960784, alpha: 1)
        viewForShadow.layer.shadowOffset = CGSize.zero
        viewForShadow.layer.shadowRadius = 4
        viewForShadow.layer.shadowOpacity = 1
        viewForShadow.backgroundColor = .clear
    }

如您所见,没有shadowPath

WhiteView(包含bottomBlueView的视图)会有一些圆角半径设置:

    fileprivate func setupWhiteView() {
        whiteView.layer.cornerRadius = 5.0
        whiteView.layer.masksToBounds = true
    }

应该够了。

【讨论】:

    猜你喜欢
    • 2021-02-09
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    相关资源
    最近更新 更多