2015-04-09 1 views
1

targetAutolayout - Вертикально центр два вида в UITableViewCell, когда один вид имеет динамической высоту

Это то, что я пытаюсь добиться. Внутри UITableView Cell у меня есть UIlabel, заполненный динамическим контентом и отдельным UIView, который имеет заданную высоту. В некоторых случаях, когда имеется много текста, UIlabel определяет высоту ячейки UITableView. В других случаях, когда имеется только одна строка текста, заполняющая UILabel, UIView устанавливает высоту ячейки. (Это то, что я в настоящее время.)

self.myLabel.setTranslatesAutoresizingMaskIntoConstraints(false) 
    self.myView.setTranslatesAutoresizingMaskIntoConstraints(false) 


    let viewsDictionary = [ 
     "myLabel":myLabel, 
     "myView":myView, 
    ] 


    let myLabel_H:Array = NSLayoutConstraint.constraintsWithVisualFormat("H:|-15-[myLabel]-60-|", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDictionary) 
    let myLabel_V:Array = NSLayoutConstraint.constraintsWithVisualFormat("V:|-[myLabel]-|", options:NSLayoutFormatOptions(0), metrics: nil, views: viewsDictionary) 

    self.contentView.addConstraints(myLabel_H) 
    self.contentView.addConstraints(myLabel_V) 


    let myView_H:Array = NSLayoutConstraint.constraintsWithVisualFormat("H:[myView(50)]-|", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDictionary) 
    let myView_V:Array = NSLayoutConstraint.constraintsWithVisualFormat("V:|-(>=10)-[myView(100)]-(>=10)-|", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDictionary) 

    self.contentView.addConstraints(myView_H) 
    self.contentView.addConstraints(myView_V) 

Вместо этого я получаю это: (И я бросал ошибки: = 10) - | (Имена: '|': UITableViewCellContentView: 0x7fc21bc6d050)>)

current

+0

Перейдите по этой ссылке .... http://stackoverflow.com/questions/18527227/uitableviewcell-with-dynamic-height-ios – Rahul

+0

Да ...... и в чем проблема ? Какой результат дает вам ваш код? – rdelmar

ответ

0

Вы можете выровнять два подвидов, используя значение выравнивания в параметре параметров методы визуального макета (.AlignAllCenterY), так что вам не нужен добавьте отдельное ограничение для просмотра изображения, чтобы центрировать его в направлении y. Кроме того, было бы лучше, если бы горизонтальные ограничения переместились с левого края на метку на вид изображения на правый край, вместо того, чтобы привязывать метку к обоим краям супервизора.

class RDTableViewCell: UITableViewCell { 

    var myLabel = UILabel() 
    var myView = UIImageView() 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
     super.init(style: style, reuseIdentifier: reuseIdentifier) 

     myLabel.numberOfLines = 0 
     myLabel.setTranslatesAutoresizingMaskIntoConstraints(false) 
     myView.setTranslatesAutoresizingMaskIntoConstraints(false) 

     contentView.addSubview(myLabel) 
     contentView.addSubview(myView) 

     let viewsDictionary = ["myLabel":myLabel, "myView":myView] 

     let horizontalCons = NSLayoutConstraint.constraintsWithVisualFormat("H:|-15-[myLabel]-[myView(50)]-|", options: .AlignAllCenterY, metrics: nil, views: viewsDictionary) 
     let myLabel_V = NSLayoutConstraint.constraintsWithVisualFormat("V:|-[myLabel]-|", options:NSLayoutFormatOptions(0), metrics: nil, views: viewsDictionary) 
     let myView_V = NSLayoutConstraint.constraintsWithVisualFormat("V:|-(>=10)-[myView(100)]-(>=10)-|", options: NSLayoutFormatOptions(0), metrics: nil, views: viewsDictionary) 

     contentView.addConstraints(horizontalCons) 
     contentView.addConstraints(myLabel_V) 
     contentView.addConstraints(myView_V) 
    } 
} 
+0

мастерский. Вы получаете предупреждения? О нарушении ограничений? Я все еще получаю сообщение о том, что ограничение должно быть нарушено. В частности, я думаю, что это «V: | - (> = 10) - [myView (100)] - (> = 10) - |" – DeliciousMe

+0

Нужно ли опускать приоритет надписи на этикетке? –

+0

@DeliciousMe Нет, я не получаю никаких предупреждений. Вы устанавливаете свойство contentMode изображения в нечто иное, чем значение по умолчанию, UIViewContentModeScaleToFill? Вы добавляете subviews в код, как я делаю (нет xib или раскадровки)? Кроме того, вы устанавливаете значение оценочного значения RowHeight и устанавливаете высоту строки в UITableViewAutomaticDimension? – rdelmar

2

Вы должны использовать визуальный формат нон Автокомпоновка.

В ObjC это будет выглядеть примерно так:

[self.viewOuterView addConstraint:[NSlayoutConstraint constraintWithItem:self.innerView attribute:NSLayoutAttributeCenterY relateBy:NSLayoutRelationEqual toItem:self.outerView attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0]]; 
+0

отлично попробует это. Это связано с VFL или вы говорите, что нет способа VFL для этого? – DeliciousMe

+0

Это работает в сочетании с тем, что у меня есть. Кроме того, я все еще бросаю ошибку: 2015-04-09 09: 43: 06.403 таблицы [87834: 4701607] Невозможно одновременно удовлетворить ограничения. Попытаться восстановить путем нарушения ограничения = 10) - | (Имена: '|': UITableViewCellContentView: 0x7f8ee8e37ee0)> – DeliciousMe

+0

Это потому, что теперь у вас есть два «вертикальных» ограничения на одном и том же представлении, которые автомат не будет принимать. Попробуйте удалить ограничение, на которое он жалуется, и посмотреть, что произойдет. – Chris

 Смежные вопросы

  • Нет связанных вопросов^_^