2016-09-25 3 views

답변

3

여러 가지 방법이 있지만 테두리를 직접 그릴 때 조금 더 조정할 수 있습니다. UIView의 하위 클래스를 지정하고 CAShapeLayer을 사용하여이 작업을 수행하는 것이 좋습니다.

(스위프트 3 사용)의 효과에 뭔가 :

import UIKit 

class TopBorderedView: UIView { 
    //decalare a private topBorder 
    fileprivate weak var topBorder: CAShapeLayer? 

    //declare a border thickness to allow outside access to setting it 
    var topThickness: CGFloat = 1.0 { 
     didSet { 
      drawTopBorder() 
     } 
    } 

    //declare public color to allow outside access 
    var topColor: UIColor = UIColor.lightGray { 
     didSet { 
      drawTopBorder() 
     } 
    } 

    //implment the draw method 
    fileprivate func drawTopBorder() { 
     let start = CGPoint(x: 0, y: 0) 
     let end = CGPoint(x: bounds.width, y: 0) 
     removeIfNeeded(topBorder) 
     topBorder = addBorder(from: start, to: end, color: topColor, thickness: topThickness) 
    } 

    //implement a private border drawing method that could be used for border on other sides if desired, etc.. 
    fileprivate func addBorder(from: CGPoint, to: CGPoint, color: UIColor, thickness: CGFloat) -> CAShapeLayer { 
      let border = CAShapeLayer() 
      let path = UIBezierPath() 
      path.move(to: start) 
      path.addLine(to: end) 
      border.path = path.cgPath 
      border.strokeColor = color.cgColor 
      border.lineWidth = thickness 
      border.fillColor = nil 
      layer.addSublayer(border) 
      return border 
    } 

    //used to remove the border and make room for a redraw to be autolayout friendly 
    fileprivate func removeIfNeeded(_ border: CAShapeLayer?) { 
     if let bdr = border { 
      bdr.removeFromSuperlayer() 
     } 
    } 

    //override layoutSubviews() (probably debatable) and call the drawTopBorder method to draw and redraw if needed 
    override func layoutSubviews() { 
     super.layoutSubviews() 
     drawTopBorder() 
    } 
} 

최대 재사용을 위해 스토리 보드의 맥락에서 - 난이 같은 일반적인 UI 패턴을 @IBDesignable 및 @IBInspectable를 사용하여 한 번 봐 걸릴 것 . 알맞은 소개를 위해 체크 아웃 NSHipster: IBDesignable and IBInspectable

관련 문제