Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add a border just on the top side of a UIView

My question is on the title.

I don't know how to add a border in a specific side, top or bottom, any side... layer.border draws the border for the whole view...

like image 298
manonthemoon Avatar asked Jun 28 '13 00:06

manonthemoon


People also ask

What is layer Swift?

Overview. Layers are often used to provide the backing store for views but can also be used without a view to display content. A layer's main job is to manage the visual content that you provide but the layer itself has visual attributes that can be set, such as a background color, border, and shadow.


1 Answers

I consider subclassing UIView and overriding drawRect overkill here. Why not add an extension on UIView and add border subviews?

@discardableResult func addBorders(edges: UIRectEdge,                 color: UIColor,                 inset: CGFloat = 0.0,                 thickness: CGFloat = 1.0) -> [UIView] {      var borders = [UIView]()      @discardableResult     func addBorder(formats: String...) -> UIView {         let border = UIView(frame: .zero)         border.backgroundColor = color         border.translatesAutoresizingMaskIntoConstraints = false         addSubview(border)         addConstraints(formats.flatMap {             NSLayoutConstraint.constraints(withVisualFormat: $0,                                            options: [],                                            metrics: ["inset": inset, "thickness": thickness],                                            views: ["border": border]) })         borders.append(border)         return border     }       if edges.contains(.top) || edges.contains(.all) {         addBorder(formats: "V:|-0-[border(==thickness)]", "H:|-inset-[border]-inset-|")     }      if edges.contains(.bottom) || edges.contains(.all) {         addBorder(formats: "V:[border(==thickness)]-0-|", "H:|-inset-[border]-inset-|")     }      if edges.contains(.left) || edges.contains(.all) {         addBorder(formats: "V:|-inset-[border]-inset-|", "H:|-0-[border(==thickness)]")     }      if edges.contains(.right) || edges.contains(.all) {         addBorder(formats: "V:|-inset-[border]-inset-|", "H:[border(==thickness)]-0-|")     }      return borders }      // Usage:              view.addBorder(edges: [.all]) // All with default arguments      view.addBorder(edges: [.top], color: .green) // Just Top, green, default thickness     view.addBorder(edges: [.left, .right, .bottom], color: .red, thickness: 3) // All except Top, red, thickness 3 

With this code you're not tied to your subclass too, you can apply it to anything and everything that inherits from UIView - reusable in your project, and any others. Pass in other arguments to your methods to define other colours and widths. Many options.

like image 191
Adam Waite Avatar answered Oct 02 '22 15:10

Adam Waite