【问题标题】:UIView shadow on Ipad doesn't span the width of the view correctlyIpad 上的 UIView 阴影未正确跨越视图的宽度
【发布时间】:2019-03-22 17:05:57
【问题描述】:

我在 UIView 上创建了一个简单的扩展来为 UIView 添加一个“投影”阴影,它在 iPhone 上运行良好,但在 iPad 上无法正常运行。我不知道我错过了什么,关于如何改进/修复这个问题的任何想法,以便在 iPad 和 iPhone 上正确显示阴影会很棒

extension UIView {
func addShadow() {
    self.layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
    self.layer.shadowColor = UIColor.black.cgColor
    self.layer.shadowOpacity = 0.5
    self.layer.shadowOffset = .zero
    self.layer.shadowRadius = 10
}

}

这是它在 iPad 上的样子:

我是这样从 UIView 调用它的:

class AggregateDataViewImplementation: UIView, AggregateDataView {
    override func awakeFromNib() {
        layoutView()
    }

    private func layoutView() {
        self.addShadow()
    }

...

}

【问题讨论】:

  • 什么时候调用 addShadow?调用它的 UIView 是什么?
  • 你能告诉你在哪里添加阴影的方法
  • 你是在 ViewDidLoad 中调用 addShadow 吗?
  • 我已经更新了上面的问题以显示该方法是如何被调用的。从笔尖唤醒后,我们从 UIView 调用它

标签: ios swift ipad uiview


【解决方案1】:

也许你的问题就在这里:

self.layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath

阴影的矩形是根据这里的,如果self.bounds不符合实际的矩形,可能会有错误显示。建议这样写,

 self.bgView.layer.shadowPath = UIBezierPath(rect: self.bgView.bounds).cgPath
 self.bgView.layer.shadowColor = UIColor.black.cgColor
 self.bgView.layer.shadowOpacity = 0.5
 self.bgView.layer.shadowOffset = .zero
 self.bgView.layer.shadowRadius = 10

希望能帮到你。

【讨论】:

    【解决方案2】:

    阅读 cmets 让我思考,我能够通过移动一些东西来完美地工作!感谢大家抽出宝贵时间发表评论!

    我保留了 UIView 的扩展,但将调用从 awakeFromNib() 调用移到了视图父 VC 的 viewDidLoad() 调用中。为了处理设备轮换,我添加了对viewWillTransition(...) 的调用,完整的sn-p 如下。

     // MARK: - Lifecycle
    
    override func viewDidLoad() {
        super.viewDidLoad()
        guard let primaryView = primaryView as? AggregateDataViewImplementation else { return }
        primaryView.didTapClose = { [weak self] in
            self?.didTapClose?()
        }
        primaryView.tableView.delegate = self
        primaryView.tableView.dataSource = self
        primaryView.tableView.tableFooterView = UIView()
    
        let nib = UINib(nibName: "AggregateDataTableViewCell", bundle: nil)
        primaryView.tableView.register(nib, forCellReuseIdentifier: "AggregateDataTableViewCell")
        primaryView.addShadow()
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        guard let primaryView = primaryView as? AggregateDataViewImplementation else { return }
        primaryView.tableView.reloadData()
    }
    
    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
    
        coordinator.animate(alongsideTransition: { (_) in
            guard let primaryView = self.primaryView as? AggregateDataViewImplementation else { return }
            primaryView.addShadow()
        }, completion: nil)
    
    }
    

    再次感谢!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多