【问题标题】:Apply a shadow on a UIView that have same corner radius than view在具有与视图相同的角半径的 UIView 上应用阴影
【发布时间】:2019-12-12 01:44:50
【问题描述】:

您好,我有一些带圆角的视图,我想为这些视图应用阴影。

所以首先我要环视一下:

view.layer.cornerRadius = 15
view.clipsToBounds = true

然后我应用阴影:

    func dropShadow(scale: Bool = true) {
        self.layer.masksToBounds = false
        self.layer.cornerRadius = 15
        self.layer.shadowColor = UIColor.black.cgColor
        self.layer.shadowPath = UIBezierPath(roundedRect: self.bounds, cornerRadius: self.layer.cornerRadius).cgPath
        self.layer.shadowOffset = CGSize(width: 3, height: 3)
        self.layer.shadowOpacity = 0.5
        self.layer.shadowRadius = 5
    }
view.dropShadow()

我得到了带有阴影的圆形视图,但阴影不像我的视图那样是圆形的。阴影根本不圆

【问题讨论】:

标签: swift xcode uikit


【解决方案1】:

您不能从clipsToBoundstrue 的视图投射阴影。如果一个视图的masksToBoundstrue,那么它的clipsToBoundstrue;它们是一样的。

如果您希望阴影看起来来自剪辑视图,您需要使用 两个 视图:一个用户可以看到的视图,带有圆角,clipsToBounds 设置为 @ 987654332@,以及另一个用户无法看到的,因为它在第一个后面,也是圆角,但clipsToBounds 设置为false,到投下阴影。

class ShadowView : UIView {
    override init(frame: CGRect) {
        super.init(frame:frame)
        self.isOpaque = true
        self.backgroundColor = .black
        self.dropShadow()
    }
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    func dropShadow() {
        self.layer.masksToBounds = false
        self.layer.cornerRadius = 15
        self.layer.shadowColor = UIColor.black.cgColor
        self.layer.shadowOffset = CGSize(width: 3, height: 3)
        self.layer.shadowOpacity = 0.5
        self.layer.shadowRadius = 5
    }
}

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let r = CGRect(x: 100, y: 100, width: 100, height: 100)
        let v = UIImageView(frame:r)
        v.image = UIImage(named:"marsSurface.jpg")
        v.clipsToBounds = true
        v.backgroundColor = .red
        v.layer.cornerRadius = 15
        self.view.addSubview(ShadowView(frame:r))
        self.view.addSubview(v)
    }
}

请注意,这两个视图都不是另一个视图的子视图,也没有剪辑的父视图,因为 会剪辑阴影。

【讨论】:

  • 我试过这个:``` for view in self.views { view!.layer.cornerRadius = 15 view!.clipsToBounds = false view!.layer.masksToBounds = false view!.layer.shadowColor = UIColor.black.cgColor view!.layer.shadowPath = UIBezierPath(roundedRect: view!.bounds,cornerRadius: view!.layer.cornerRadius).cgPath view!.layer.shadowOffset = CGSize(width: 3, height: 3) view!.layer.shadowOpacity = 0.5 view!.layer.shadowRadius = 5 } ```而且阴影仍然不圆
  • 耸耸肩。我向您展示了我的全部代码,并向您展示了结果。如果你想要我得到的结果,就做我所做的。你正在做其他事情,所以你会得到不同的结果。
  • 你的影子圆的。但是后来是clipped,因为您没有听我在回答的最后一段中所说的话。问题不在于您的阴影舍入;问题是您的阴影视图的 superview 将阴影限制在自己的矩形内。
  • 你说如果 clipsTobounds 设置为 false 我可以看到圆形阴影。这就是我所做的,但仍然没有四舍五入。
  • 我不使用直接但情节提要,这就是我用你的代码得到的:hebergeur-images.com/vi/0cc2422b41193c82dfe584e57b99f51e
【解决方案2】:

不建议尝试让单个视图同时处理圆角和阴影逻辑。创建您正在寻找的效果的最佳方法是将圆形视图与另一个拥有阴影的父视图包裹起来。

最好用游乐场来说明这一点。在操场上试用此代码。

import UIKit
import PlaygroundSupport

class MyViewController : UIViewController {
  override func loadView() {
    let view = UIView()
    view.backgroundColor = .white

    let shadowView = UIView()
    shadowView.frame = CGRect(x: 50, y: 200, width: 200, height: 100)
    shadowView.backgroundColor = nil
    shadowView.layer.shadowColor = UIColor.black.cgColor
    shadowView.layer.shadowOffset = CGSize(width: 0, height: 4.0)
    shadowView.layer.shadowRadius = 8.0
    shadowView.layer.shadowOpacity = 1

    let roundedView = UIView()
    roundedView.frame = shadowView.bounds
    roundedView.backgroundColor = .gray
    roundedView.layer.maskedCorners = [.layerMinXMinYCorner, .layerMinXMaxYCorner, .layerMaxXMaxYCorner,.layerMaxXMinYCorner]
    roundedView.layer.cornerRadius = 10
    roundedView.layer.masksToBounds = true

    shadowView.addSubview(roundedView)
    view.addSubview(shadowView)

    view.backgroundColor = UIColor.white
    self.view = view
  }
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()

不要忘记在viewWillLayoutSubviewslayoutSubviews 的阴影视图层上设置shadowPath 属性。如果此属性设置为nil,UIKit 必须执行离屏渲染来确定如何绘制阴影矩形。

【讨论】:

  • 请给我代码,我可以直接在我的视图上使用,如果可能的话,一个 UIView 扩展。我试过你的游乐场,但什么也没发生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多