Ios 设置视图';s圆角和阴影

Ios 设置视图';s圆角和阴影,ios,swift,shadow,rounded-corners,Ios,Swift,Shadow,Rounded Corners,我需要绕过视图的左下角和右下角,根据我在internet上找到的内容,我在UIview扩展中创建了此函数: func setRoundedCorner(withRadius radius: CGSize, forCorners corners: UIRectCorner ) { let viewShape = CAShapeLayer() viewShape.bounds = CGRect(x: self.frame.origin.x, y: self.frame.origin

我需要绕过视图的左下角和右下角,根据我在internet上找到的内容,我在UIview扩展中创建了此函数:

func setRoundedCorner(withRadius radius: CGSize, forCorners corners: UIRectCorner ) {

    let viewShape = CAShapeLayer()
    viewShape.bounds = CGRect(x: self.frame.origin.x, y: self.frame.origin.y, width: self.bounds.width, height: self.bounds.height)
    viewShape.position = self.center
    viewShape.path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: radius).cgPath
    self.layer.mask = viewShape

}
现在,我在这个解决方案中遇到了两个问题;尽管它对静态视图非常有效,但我的视图以编程方式更改其高度,导致视图被截断;我找到了一个解决这个问题的方法,每次调用
setRoundedCorner
方法,但在我看来这是非常不舒服的;还有别的办法解决这个问题吗?另一个我很难解决的问题是阴影集。我通常使用这种方法:

func setShadow(height: CGFloat, width: CGFloat, opacity: Float, radius: CGFloat) {
    self.layer.shadowPath = UIBezierPath(roundedRect: self.bounds, cornerRadius: self.layer.cornerRadius).cgPath
    self.layer.shadowColor = UIColor.black.cgColor
    self.layer.shadowOpacity = opacity
    self.layer.shadowOffset = CGSize(width: width, height: height)
    self.layer.cornerRadius = radius
    self.layer.masksToBounds = false
}
相反,当视图自身下应有阴影时,视图会以这种方式显示:


但在这种情况下,根本不显示任何阴影似乎不起作用。有谁能给我一些建议吗?

在这里,我与您分享我的添加角半径(使用BezierPath)的类别,同时支持添加阴影

import UIKit

/// A category for all views.
extension UIView {
    /// Setups the layer of a view.
    public func setupLayer(
        cornerRadius: CGFloat = 22,
        borderWidth: CGFloat = 0,
        borderColor: UIColor = .clear,
        shadowOffSet: CGSize = CGSize(width: 0, height: 1),
        shadowColor: UIColor = UIColor(red:0, green:0, blue:0, alpha:0.15),
        shadowOpacity: Float = 1,
        shadowRadius: CGFloat = 2,
        shouldClipToBounds: Bool = false
        ) {

        self.layer.cornerRadius     = cornerRadius
        self.layer.borderWidth      = borderWidth
        self.layer.borderColor      = borderColor.cgColor
        self.layer.shadowOffset     = shadowOffSet
        self.layer.shadowColor      = shadowColor.cgColor
        self.layer.shadowOpacity    = shadowOpacity
        self.layer.shadowRadius     = shadowRadius
        self.clipsToBounds = shouldClipToBounds
    }

    /// Round the corner radius with bezier path.
    func roundCorners(_ corners: UIRectCorner, radius: CGFloat) {
        let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        self.layer.mask = mask
    }
}
请随意编辑此页面上的所有内容。现在,让我们谈谈你的问题。顺便说一下,这段代码,我在我的生产项目中使用它。有时,您需要在
视图didlayoutsubviews
中圆角,
视图将布局子视图
。如果您使用的是
UIView
UITableViewCell
或类似类的子类,那么您可以在它们的
draw
函数中添加圆角代码

override func draw(_ rect: CGRect) {
        super.draw(rect)
    // Round corners here...
}

最后,为了设置层,我通常在控件(例如按钮、文本字段…)的lazy init声明中调用它。了解使用bezierPath和仅通过layer.cornerRadius添加角点的区别。:)


我希望这有帮助

您只需添加此扩展名

extension UIView 
{ 
func dropShadow(scale: Bool = true) {
    layer.masksToBounds = false
    layer.shadowColor = UIColor.black.cgColor
    layer.shadowOpacity = 0.5
    layer.shadowOffset = CGSize(width: -1, height: 1)
    layer.shadowRadius = 1

    layer.shadowPath = UIBezierPath(rect: bounds).cgPath
    layer.shouldRasterize = true
    layer.rasterizationScale = scale ? UIScreen.main.scale : 1
}

func dropShadow(color: UIColor, opacity: Float = 0.5, offSet: CGSize, radius: CGFloat = 1, scale: Bool = true) {
    layer.masksToBounds = false
    layer.shadowColor = color.cgColor
    layer.shadowOpacity = opacity
    layer.shadowOffset = offSet
    layer.shadowRadius = radius

    layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
    layer.shouldRasterize = true
    layer.rasterizationScale = scale ? UIScreen.main.scale : 1
}


 }
  priceview.layer.cornerRadius = 5
  priceview.dropShadow(color: UIColor.darkGray, opacity: 0.5, offSet: CGSize(width: 1, height: 1), radius: 3, scale: true)
添加上述扩展后,您可以像下面一样使用

extension UIView 
{ 
func dropShadow(scale: Bool = true) {
    layer.masksToBounds = false
    layer.shadowColor = UIColor.black.cgColor
    layer.shadowOpacity = 0.5
    layer.shadowOffset = CGSize(width: -1, height: 1)
    layer.shadowRadius = 1

    layer.shadowPath = UIBezierPath(rect: bounds).cgPath
    layer.shouldRasterize = true
    layer.rasterizationScale = scale ? UIScreen.main.scale : 1
}

func dropShadow(color: UIColor, opacity: Float = 0.5, offSet: CGSize, radius: CGFloat = 1, scale: Bool = true) {
    layer.masksToBounds = false
    layer.shadowColor = color.cgColor
    layer.shadowOpacity = opacity
    layer.shadowOffset = offSet
    layer.shadowRadius = radius

    layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
    layer.shouldRasterize = true
    layer.rasterizationScale = scale ? UIScreen.main.scale : 1
}


 }
  priceview.layer.cornerRadius = 5
  priceview.dropShadow(color: UIColor.darkGray, opacity: 0.5, offSet: CGSize(width: 1, height: 1), radius: 3, scale: true)

我希望它能对您有所帮助。

向我们展示您获得的屏幕截图,或许还有您目标的屏幕截图。(1)您必须在知道视图的最终大小后设置遮罩的大小。在iOS 11中,也不需要面具;你可以绕过各个角落。(2) 你不能同时拥有面具和阴影,因为面具会剪辑阴影。-这两件事在这里已经解释过很多次了。请在询问之前搜索。我们可以得到预期的输出吗?@Glenn我编辑了我的question@AngryWarden我编辑了这篇文章,展示了视图现在是如何显示的…它应该是这样显示的,但是在它下面有一个阴影。好的,非常感谢你…我要尝试一下…只是几个问题…你能解释一下使用layer.cornerRadius和使用layer.cornerRadius的区别吗贝塞尔路?我使用了最后一个,因为我只需要设置底角…还有另一个问题:自定义类的draw函数是什么意思?layer.cornerRadius不需要在
draw
/
viewWillLayoutSubviews
方法中调用。而且你也在用它把所有的角都磨圆。使用BezierPath时,您可以绕过任何拐角。它可以是所有的角落,左上角,仅右上角,右下角和右上角,等等<代码>绘制方法(在单元格或UIView中)相当于控制器的
viewWillLayoutSubview
。别忘了选择一个答案来结束你的问题。如果你想问更多的问题,请打开一个新的线程(但确保它不是重复的):)是的……非常感谢……我会尝试你的代码,然后如果我解决了我的问题,我会选择你的答案。我尝试了你的代码,但它似乎不起作用……没有任何阴影。你是如何实现它的?哪一个?请看我编辑的答案,我将发布一个示例输出。它不起作用…这可能是因为该视图本身包含其他元素,并且是自定义UIView吗?是的,它本身包含许多元素,我将其提供给drop shadow,它对我来说运行良好。