2017-08-17 34 views
0

我創建了一個快速的擴展,所以我可以在Interface Builder添加邊框到一個UIView:的UIView層 - 刪除一條邊界

@IBDesignable public extension UIView { 

    @IBInspectable var borderColor:UIColor? { 
     set { 
      layer.borderColor = newValue!.cgColor 
     } 
     get { 
      if let color = layer.borderColor { 
       return UIColor(cgColor: color) 
      } 
      else { 
       return nil 
      } 
     } 
    } 
    @IBInspectable var borderWidth:CGFloat { 
     set { 
      layer.borderWidth = newValue 
     } 
     get { 
      return layer.borderWidth 
     } 
    } 
    @IBInspectable var cornerRadius:CGFloat { 
     set { 
      layer.cornerRadius = newValue 
      clipsToBounds = newValue > 0 
     } 
     get { 
      return layer.cornerRadius 
     } 
    } 
} 

現在我需要刪除左側邊框,你怎麼做? 我曾嘗試以下(從下面的UIView基類繼承),以在上面用白色加層:

class BaseViewWithLayers: UIView { 

    var l: CALayer? 
    override func layoutSubviews() { 
     l!.frame = CGRect(x: 0, y: 0, width: 1, height: self.frame.size.height) 
    } 

    override func awakeFromNib() { 
     self.l = CALayer() 
     l?.borderColor = UIColor.red.cgColor 
     l?.borderWidth = 1 
     self.layer.insertSublayer(self.l!, above: self.layer) 
//  self.layer.addSublayer(self.l!) 
    } 
} 

請注意:它應該與各種視圖的運動的工作,這是爲什麼我使用`layoutSubviews()

我更喜歡添加一個圖層來隱藏一個邊框,而不是創建3個圖層。

基本上可以在頂部添加一個白色的圖層來隱藏左邊界?

你有什麼想法嗎? 謝謝

回答

1

不,你不能通過這種方式隱藏左邊框。默認圖層的邊框始終位於頂部,因此其子圖層將被頂層邊框覆蓋。像這樣: enter image description here

所以請將0設置爲layer.borderWidth,然後手動繪製其他3個邊框。

對於cornerRadius,使用CAShapeLayer和UIBezierPath繪製1/4圈,以實現同樣的效果:

let cornerLayer = CAShapeLayer() 
    cornerLayer.frame = self.bounds 
    let path = UIBezierPath() 

    path.move(to: CGPoint(x: 10, y: 0)) 
    path.addArc(withCenter: CGPoint(x: 10, y: 10), radius: 10, startAngle: CGFloat.pi * 3.0/2.0, endAngle: CGFloat.pi, clockwise: false) 


    cornerLayer.strokeColor = UIColor.red.cgColor 
    cornerLayer.fillColor = UIColor.clear.cgColor 
    cornerLayer.lineWidth = 1; 
    cornerLayer.path = path.cgPath 

    self.layer.addSublayer(cornerLayer) 

角落將是這樣的: enter image description here

+0

你知道如何更新子的CALayer所以它遵循約束?我已經創建了這個問題:https://stackoverflow.com/questions/45750882/constraints-and-sublayerscalayer-not-updating?noredirect=1#comment78459213_45750882 –

+1

是的,我給你一個解決方案,請嘗試。 –