2017-02-10 11 views
1
myLabel.layer.borderWidth = 0.5 
myLabel.layer.borderColor = UIColor.green.cgColor 

Это простой ответ на рисование границы. Однако проблема в том, что мне нужно нарисовать границу только справа и внизу. Мне также нужен еще один ярлык, чтобы рисовать границу сверху и справа. Как я могу привязать границу к конкретным сторонам, а не ко всем четырем сторонам?Быстрое рисование границ вокруг текста или этикеток

+0

Возможный дубликат [CALayer: добавить границу только в одну сторону] (http://stackoverflow.com/questions/7022656/calayer-add-a-border -только-на-один-сторона) –

ответ

1

Добавьте слой формы и рисовать линии в этом слое. Обратите внимание, что слои не участвуют в автоматическом макете, поэтому вам нужно поместить свой код в viewDidLayoutSubviews или подкласс uilabel и сделать это в подкатегориях макета. Вот пример площадка с использованием UILabel подкласса:

import PlaygroundSupport 
    import UIKit 
    class L: UILabel { 
     var strokeColor = UIColor.blue 
     var strokeWidth = CGFloat(0.5) 
     private lazy var labelBorderLayer:CAShapeLayer = { 
      let shapeLayer = CAShapeLayer() 
      self.layer.addSublayer(shapeLayer) 
      return shapeLayer 
     }() 
     override func layoutSubviews() { 
      super.layoutSubviews() 
      let path = CGMutablePath() 
      path.move(to: CGPoint(x: 0, y: bounds.size.height)) 
      path.addLine(to: CGPoint(x: bounds.size.width, y: bounds.size.height)) 
      path.addLine(to: CGPoint(x: bounds.size.width, y: 0)) 
      labelBorderLayer.path = path 
      labelBorderLayer.strokeColor = strokeColor.cgColor 
      labelBorderLayer.lineWidth = strokeWidth 
      labelBorderLayer.fillColor = UIColor.clear.cgColor 
     } 
    } 

    let v = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200)) 
    let l = L(frame: v.frame.insetBy(dx: 50, dy: 80)) 
    v.addSubview(l) 
    l.textColor = .white 
    l.textAlignment = .center 
    l.text = "gjgkjgjgjgj" 
    v.backgroundColor = .red 
    PlaygroundPage.current.liveView = v 
0

Я не уверен, что вы можете сделать это с фактической границей ярлыка. Но но вы можете сделать что-то похожее на это

public enum UIButtonBorderSide { 
     case Top, Bottom, Left, Right 
    } 

extension UIButton { 
public func addBorder(side: UIButtonBorderSide, color: UIColor, width: CGFloat) { 
    let border = CALayer() 
    border.backgroundColor = color.CGColor 

    switch side { 
    case .Top: 
     border.frame = CGRect(x: 0, y: 0, width: frame.size.width, height: width) 
    case .Bottom: 
     border.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: width) 
    case .Left: 
     border.frame = CGRect(x: 0, y: 0, width: width, height: self.frame.size.height) 
    case .Right: 
     border.frame = CGRect(x: self.frame.size.width - width, y: 0, width: width, height: self.frame.size.height) 
    } 

    self.layer.addSublayer(border) 
} 
} 

Thats for UIButton, но вы, вероятно, можете легко его адаптировать.

Источника: https://gist.github.com/Isuru-Nanayakkara/496d5713e61125bddcf5

Надеется, что это помогает