Добавить представление из xib-файла в UITableViewCell, добавив ограничения
Я создал XIB-файл с пользовательским представлением, которое я хочу отобразить в UITableViewCell
,
Проблема в том, что в xib-файле я устанавливаю ширину UIView
до 600 (size
является Freeform
) но я хочу использовать ограничения, чтобы получить правильную ширину для каждого устройства.
Я добавляю эту точку зрения в UITableViewCell
с addSubview()
так что я думаю, что это представление должно быть ограничением для представления ячейки, верно? Как я могу это сделать?
Я добавляю немного кода:
Это мой обычай UIView
связанный с XIB-файлом:
class DownloadView: UIView, NSURLSessionDownloadDelegate{
///utilizzata per mostrare il nome del file in download
@IBOutlet var nomeFileInDownloadLabel: UILabel!
///utilizzata per mostrare la percentuale di download completato
@IBOutlet var quantitaScaricataLabel: UILabel!
///utilizzata per mostrare il download
@IBOutlet var progressView: UIProgressView!
var view : UIView!
private var downloadTask: NSURLSessionDownloadTask?
//Initialization
override init(frame: CGRect) {
super.init(frame: frame)
xibSetup()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
}
//I setup the xib from here
func xibSetup() {
view = loadViewFromNib()
//if I set the following one the view is a square
//view.frame = bounds
// Make the view stretch with containing view
view.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]
self.addSubview(view)
}
//I load the xib file
func loadViewFromNib() -> UIView {
let bundle = NSBundle(forClass: self.dynamicType)
let nib = UINib(nibName: "View", bundle: bundle)
let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
return view
}
//some code for other task
...
}
В моем UITableView
в методе tableView(tableView:cellForRowAtIndexPath)
Я добавляю вид:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("DownloadRootTVC_IDcell", forIndexPath: indexPath) as! DownloadTVCell
//I get my custom view from an array
let myView = self.listOfViewsDownlaod[indexPath.row]
//I add the view to the cell
cell.addSubview(myView)
return cell
}
В этом последнем методе я думаю, что мне нужно установить ограничение, чтобы соответствовать моему пользовательскому виду в UITableViewCell
адаптируя его к ширине устройства.
РЕДАКТИРОВАТЬ:
Так как я хочу адаптировать ширину и высоту подпредставления к ячейке, я написал это:
let topConstraint = NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: cell, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 8)
cell.addConstraint(topConstraint)
let bottomConstraint = NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: cell, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 8)
cell.addConstraint(bottomConstraint)
let leftConstraint = NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.Left, relatedBy: NSLayoutRelation.Equal, toItem: cell, attribute: NSLayoutAttribute.Left, multiplier: 1, constant: 20)
cell.addConstraint(leftConstraint)
let rightConstraint = NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.TrailingMargin, relatedBy: NSLayoutRelation.Equal, toItem: cell, attribute: NSLayoutAttribute.TrailingMargin, multiplier: 1, constant: 20)
cell.addConstraint(rightConstraint)
Единственное, что не работает, является правильным, вид продолжается по экрану. Я также пытался использовать NSLayoutAttribute.Right
или же NSLayoutAttribute.RighMargin
или установить константу в отрицательное значение, но не работает.
2 ответа
Наконец я нахожу проблему:
проблема в xibSetup()
метод, потому что я загружаю XIB, но я не устанавливаю ограничения! Итак, мой новый метод:
func xibSetup() {
let myView = loadViewFromNib()
myView.translatesAutoresizingMaskIntoConstraints = false
self.addSubview(myView)
let leading = NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: myView.superview, attribute: NSLayoutAttribute.Leading, multiplier: 1, constant: 0)
self.addConstraint(leading)
let bottom = NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: myView.superview, attribute: NSLayoutAttribute.Bottom, multiplier: 1, constant: 0)
self.addConstraint(bottom)
let trailing = NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: myView.superview, attribute: NSLayoutAttribute.Trailing, multiplier: 1, constant: 0)
self.addConstraint(trailing)
let top = NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: myView.superview, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 0)
self.addConstraint(top)
}
Это решило мою проблему.
Ваше представление xib не имеет никаких ограничений для своего суперпредставления, когда вы добавляете его как подпредставление. Вы должны создать их программно. Есть отличный пример. Например, если вы хотите разместить свое представление в центре суперпредставления и того же размера, вы можете написать следующее:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("cell")!
let myView = UIView()
myView.backgroundColor = UIColor.redColor()
myView.translatesAutoresizingMaskIntoConstraints = false
cell.addSubview(myView)
let horizontalConstraint = NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: cell, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0)
cell.addConstraint(horizontalConstraint)
let verticalConstraint = NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: cell, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0)
cell.addConstraint(verticalConstraint)
let widthConstraint = NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: cell, attribute: NSLayoutAttribute.Width, multiplier: 1, constant: 0)
cell.addConstraint(widthConstraint)
let heightConstraint = NSLayoutConstraint(item: myView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: cell, attribute: NSLayoutAttribute.Height, multiplier: 1, constant: 0)
cell.addConstraint(heightConstraint)
return cell
}
Это будет выглядеть так (синий - tableView, красный - myView):