Ios 设置视图';s圆角和阴影
我需要绕过视图的左下角和右下角,根据我在internet上找到的内容,我在UIview扩展中创建了此函数: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
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,它对我来说运行良好。