天天看點

ios view添加上邊框_如何在UIView的頂部添加邊框

ios view添加上邊框_如何在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...

解決方案

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.