【问题标题】:UIView borderWidth not visibleUIView 边框宽度不可见
【发布时间】:2017-07-05 07:17:29
【问题描述】:

我想要一个带有黑色中心和彩色边框的圆形视图。当我这样设置视图时:

myView.backgroundColor = UIColor.red
myView.layer.borderColor = UIColor.white.cgColor
myView.layer.borderWidth = 3

我只得到一个红色的圆。但是当我转到 Debug View Hierarchy 时,我看到 myView 有一个白色边框。疯狂!我做错了什么?

iPhone: 和调试视图层次结构:

【问题讨论】:

  • 有意思,试试把这行myView.layer.backgroundColor = UIColor.red.cgColor改成myView.backgroundColor = UIColor.red
  • @k8mil,对不起,我都试过了。就在我复制粘贴代码sn-p的时候,我用了layer.backgroundColor。我编辑了我的帖子
  • 您是否尝试在背景颜色的红色上设置不透明度 0.5 以查看白色是否透出?
  • 你试过maskToBoundsclipToBounds值到true
  • @rjndra,是的,我都试过了

标签: ios swift uiview calayer


【解决方案1】:

您可以像下面这样使用自定义边框和背景

@IBDesignable class view_border_background: UIView {

private let gradientLayer : CAGradientLayer = CAGradientLayer()

 //let gradientLayer = CAGradientLayer()

// IBInspectable properties for the gradient colors
@IBInspectable var bottomColor: UIColor = UIColor(hex: 0xe5e5e5)
@IBInspectable var middleColor: UIColor = UIColor(hex: 0xe5e5e5)
@IBInspectable var topColor: UIColor = UIColor(hex: 0xe5e5e5)
@IBInspectable var bottomColorAlpha: CGFloat = 1.0
@IBInspectable var middleColorAlpha: CGFloat = 1.0
@IBInspectable var topColorAlpha: CGFloat = 1.0

// IBInspectable properties for rounded corners and border color / width
@IBInspectable var cornerSize: CGFloat = 0
@IBInspectable var borderSize: CGFloat = 1
@IBInspectable var borderColor: UIColor = colorize(hex: 0x8bc218)
@IBInspectable var borderAlpha: CGFloat = 1.0

override func draw(_ rect: CGRect) {


    // set up border and cornerRadius
    self.layer.cornerRadius = cornerSize
    self.layer.borderColor = borderColor.withAlphaComponent(borderAlpha).cgColor
    self.layer.borderWidth = borderSize

    self.layer.masksToBounds = true

    // set up gradient

    gradientLayer.frame = rect
    let c1 = bottomColor.withAlphaComponent(bottomColorAlpha).cgColor
    let c2 = middleColor.withAlphaComponent(middleColorAlpha).cgColor
    let c3 = topColor.withAlphaComponent(topColorAlpha).cgColor
    gradientLayer.colors = [c3, c2, c1]
    gradientLayer.startPoint = CGPoint(x: 0, y: 0)
    gradientLayer.endPoint = CGPoint(x: 0, y: 0)
   self.layer.insertSublayer(gradientLayer, at: 0)


}
override public func layoutSubviews() {
    super.layoutSubviews()

    gradientLayer.frame = self.layer.bounds
    }

  }

十六进制颜色转换

func colorize (hex: Int, alpha: Double = 1) -> UIColor {
let red = Double((hex & 0xFF0000) >> 16) / 255.0
let green = Double((hex & 0xFF00) >> 8) / 255.0
let blue = Double((hex & 0xFF)) / 255.0
var color: UIColor = UIColor( red: CGFloat(red), green: CGFloat(green), blue: CGFloat(blue), alpha:CGFloat(alpha) )
return color

}

只需在 VIView 中添加“view_border_background”显示身份检查器

【讨论】:

    【解决方案2】:

    我已经测试过了,在我的模拟器中运行良好

    override func viewDidLoad() {
        super.viewDidLoad()
    
        myView.layer.cornerRadius = myView.frame.size.width/2 //first make your view as rounded. 
    
        myView.layer.backgroundColor = UIColor.red.cgColor //convert into cgColor
        myView.layer.borderColor = UIColor.white.cgColor
        myView.layer.borderWidth = 3
    }
    

    【讨论】:

    • 我都试过了:UIView.backgroundColor 和 UIView.layer.backgroundColor。这没有帮助。
    猜你喜欢
    • 2022-01-11
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多