Reputation: 149
NSLayoutConstraint Hello, I've been trying to wrap my head arround NSLayoutConstraint withVisualFormat and I'm having a heck of a time. I have three lables and I want to order them in a specific format but I cant seem to get it. I'm doing this in a custom UITableViewCell.
I have tried to draw the cell layout below. How would I accomplist this?
--------------------------------------------------------------------------------
(10 padding)Name
ColorName(10 padding)
(10 padding)Description
--------------------------------------------------------------------------------
Upvotes: 1
Views: 621
Reputation: 817
The trick is to use multiple visual constraints to arrange everything vertically and horizontally. You can combine all three views together into one vertical constraint because they're all lined up, but for the horizontal constraints, you'll need one for each row (so three total).
You'll need to specify the heights of the elements in the visual constraint to have everything line up
Here's some sample code:
let name = UITextField(frame: CGRect())
name.text = "Name"
name.translatesAutoresizingMaskIntoConstraints = false
name.backgroundColor = UIColor.red
let colorName = UITextField(frame: CGRect())
colorName.text = "ColorName"
colorName.translatesAutoresizingMaskIntoConstraints = false
colorName.backgroundColor = UIColor.gray
let description = UITextField(frame: CGRect())
description.text = "Description"
description.translatesAutoresizingMaskIntoConstraints = false
description.backgroundColor = UIColor.green
view.addSubview(name)
view.addSubview(colorName)
view.addSubview(description)
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-(10)-[name]", options: [], metrics: nil, views: ["name": name]))
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:[colorName]-(10)-|", options: [], metrics: nil, views: ["colorName": colorName]))
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-(10)-[description]", options: [], metrics: nil, views: ["description": description]))
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-(50)-[name]-(10)-[colorName]-(10)-[description]", options: [], metrics: nil, views: ["name": name, "colorName": colorName, "description": description]))
For the vertical constraint, I used a padding of 50 from the top, and 10 points between each object. Obviously, you can set these to whatever you want.
Upvotes: 1
Reputation: 21883
I'd recommend a couple of things. Firstly don't use visual layout. Apple now recommends using the constraint anchors in code. Visual layout might seem easy. But it's not the most maintainable. Secondly, use IB if you can, it's just simpler and easier. And finally, for what you appear to be doing, use a UIStackView instead of trying to build the constraints yourself. Again, just easier and it's designed to do exactly what you want.
Upvotes: 1