2016-04-13 18 views
9

Tôi muốn có một hành vi tương tự hơn thẻ HTML <Table>, theo nghĩa khung được định kích thước theo nội dung của nó.Cách kích thước UIStackView tùy thuộc vào nội dung của nó?

Trong hoàn cảnh của tôi, tôi sử dụng UIStackView làm chế độ xem nội dung của UITableViewCell. Vì các mục trong ô là thông tin khác nhau nên chiều cao kết quả của ô sẽ thay đổi.

chiến lược của tôi là để lập trình xây dựng một tế bào như một UIStackView với một trục .Vertical, như trong đoạn mã như sau:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) 

    let sv = UIStackView(frame: tableview.frame) 
    sv.axis = .Vertical 
    cell.addSubview(sv) 
    for i in information { 
     let l = UILabel() 
     l.text = i 
     sv.addSubViewAndArrange(l) 
    } 

    return cell 
} 

Thật không may, kích thước tế bào không điều chỉnh nội dung, và như kết quả là tôi phải tự thiết lập chiều cao của ô, như sau:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return cellHeight  // a constant 
} 

Làm cách nào để khắc phục điều đó?

+1

Tôi nghĩ bạn đúng cách nên hạn chế stackView của bạn với các tế bào cho phương pháp này để làm việc. – zcui93

+1

Tôi đã thử nghiệm đường dẫn này (thêm sv T-T, L-L, R-R, B-B ràng buộc vào tế bào), nhưng kết quả này trong tế bào cực rộng (bạn chỉ nhìn thấy một tế bào tại một thời điểm). @ zcui93 –

+0

StackView trên riêng của nó nên được hạn chế với tế bào, do đó, tế bào sẽ phát triển với nó. Sau đó, thiết lập các bản xem trước để StackView phát triển đúng dựa trên "Kích thước nội dung nội tại" của chúng – zcui93

Trả lời

0

UIStackView được thiết kế để tăng kích thước của nó theo nội dung. Để làm việc đó, bạn cần phải thiết lập các ràng buộc giữa UIStackViewUITableViewCell. Ví dụ, đây là cách hạn chế như thế nào trong xây dựng giao diện:

enter image description here enter image description here

Nếu bạn thích thiết lập các ràng buộc trong mã, mà nên làm việc quá.

Để chứng minh rằng điều này sẽ hoạt động, tôi có điều này cho chức năng cellForRowAt. Về cơ bản, nó đặt một số UILabel bên trong UIStackView và số lượng nhãn tùy thuộc vào số hàng.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "TableviewCell", for: indexPath) as! TableviewCell 
    for i in 1...indexPath.row + 1 { 
     let label = UILabel() 
     label.text = "Row \(indexPath.row), Label \(i)" 
     cell.stackView.addArrangedSubview(label) 
    } 
    return cell 
} 

Dưới đây là kết quả cuối cùng:

https://github.com/yzhong52/AutosizeStackview

Các vấn đề liên quan