Желаемая Вид:Добавление метки программно совмещена с этикетками из раскадровки
В раскадровке у меня есть две метки с синим фоном, который я создаю в Autolayout. Их положение никогда не изменится. Затем я хотел бы добавить где-нибудь от 1 до 10 меток в коде в cellForRowAtIndexPath
под ярлыками синего фона.
Я стараюсь выровнять ярлыки, добавленные в код (коричневый фон), с созданными в Autolayout (синий фон).
Ниже моя неудачная попытка:
два подхода, которые не удалось:
В
cellForRowAtIndexPath
получить кадр "B AutoLayout Static Ярлык" и использовать положение X для динамического Этикетки. Не работал.Добавление ограничений также не сработало - возможно, я не добавляю ограничения правильно.
Вот код:
class TableViewController: UITableViewController {
var cellHeight = [Int: CGFloat]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.estimatedRowHeight = 85.0
self.tableView.rowHeight = UITableViewAutomaticDimension
}
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 4
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! CustomCell
let xLocation = cell.labelBStatic.frame.origin.x
var yLocation = cell.labelBStatic.frame.origin.y
let height = cell.labelBStatic.frame.size.height
var startYLocation = yLocation + height + 20
var i = 0
if indexPath.row % 2 == 0 {
i = 5
} else {
i = 7
}
while i < 10 {
let aLabel = UILabel()
aLabel.backgroundColor = UIColor.orangeColor()
aLabel.text = "Label # \(i)"
cell.contentView.addSubview(aLabel)
addConstraints(aLabel, verticalSpacing: startYLocation)
startYLocation += 20
i++
}
print(startYLocation)
cellHeight[indexPath.row] = startYLocation
return cell
}
func addConstraints(labelView: UILabel, verticalSpacing: CGFloat) {
// set Autoresizing Mask to false
labelView.translatesAutoresizingMaskIntoConstraints = false
//make dictionary for views
let viewsDictionary = ["view1": labelView]
//sizing constraints
let view1_constraint_H:Array = NSLayoutConstraint.constraintsWithVisualFormat("H:[view1(>=50)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewsDictionary)
labelView.addConstraints(view1_constraint_H)
//position constraints
let view_constraint_H:NSArray = NSLayoutConstraint.constraintsWithVisualFormat("H:|-15-[view1]", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: viewsDictionary)
let view_constraint_V:NSArray = NSLayoutConstraint.constraintsWithVisualFormat("V:|-\(verticalSpacing)-[view1]", options: NSLayoutFormatOptions.AlignAllLeading, metrics: nil, views: viewsDictionary)
view.addConstraints(view_constraint_H as! [NSLayoutConstraint])
view.addConstraints(view_constraint_V as! [NSLayoutConstraint])
}
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
if let height = cellHeight[indexPath.row] {
return height
}
return 0
}
Ниже Storyboard
установки (Обе метки горизонтально по центру):
Вопрос: Как я могу получить мои динамические метки что я создаю в cellForRowAtIndexPath
левой выровненной с моими статическими метками, которые были созданы в Storyboard
, чтобы соответствовать моим желаемым посмотреть сверху?
Спасибо. Я думаю, что это должно сработать. Я попробую это через пару часов и отчитаюсь. – user1107173
Я добавил нижнее ограничение таким образом 'let bottomSpaceConstraint: NSLayoutConstraint = NSLayoutConstraint (item: lastLabel, атрибут: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: lastLabel.superview, атрибут: NSLayoutAttribute.Bottom, multiplier: 1, constant: -5); // Константа - это интервал между cell.contentView.addConstraint (bottomSpaceConstraint) '- это правильный подход? – user1107173
См. Обновленный ответ. –