2015-10-05 13 views
13

Tôi có một ứng dụng chi tiết điển hình cho phép người dùng duyệt danh sách các đối tượng cuộn và sau đó khoan chi tiết cho bất kỳ đối tượng cụ thể nào bằng một khoảng cách đẩy. Danh sách chính cuộn là một UITableView được xây dựng với các ô mẫu thử nghiệm và cảnh chi tiết là một UITableView tĩnh với số lượng cố định các phần và ô.Các loại động và các ô tự định kích thước với bảng tĩnh

Tôi muốn triển khai các loại động và các ô tự định kích thước trong ứng dụng của mình để người dùng có thể thay đổi kích thước phông chữ cơ bản. Cho đến nay, tôi đã tạo thành công các ô tự định kích thước bằng danh sách cuộn các ô mẫu: bằng cách sử dụng Bố cục tự động, đặt số dòng trong mỗi nhãn thành 0 và đặt tableView.rowHeight = UITableViewAutomaticDimension, chiều cao của mỗi ô mẫu phát triển hoặc thu nhỏ để chứa kích thước của văn bản bên trong.

Nhưng tôi không thể đạt được hiệu quả tương tự trong chế độ xem bảng tĩnh của mình. Cho dù tôi sử dụng các ô tùy chỉnh hoặc các kiểu ô có sẵn, phông chữ sẽ tăng/co lại nhưng chiều cao ô không.

Vì vậy, câu hỏi của tôi thực sự là hai câu hỏi: 1) có thể triển khai các ô tự định kích thước trong chế độ xem bảng tĩnh hay không, như tôi đã thực hiện với chế độ xem bảng mẫu của mình? và 2) nếu câu trả lời cho câu hỏi đầu tiên là không, làm cách nào để viết mã sẽ đo chiều cao của nhãn trong ô xem bảng tĩnh và điều chỉnh chiều cao ô thích hợp?

Cảm ơn bạn!

Trả lời

1

Tôi rất biết ơn các câu trả lời được cung cấp cho câu hỏi tôi đã đăng hôm qua. Thật không may (và có thể vì sự thiếu kinh nghiệm của riêng tôi với tư cách là một lập trình viên iOS), tôi đã không thể thực hiện phương thức tiếp cận systemLayoutSizeFittingSize (UILayoutFittingCompressedSize). Sau một số thử và sai, tuy nhiên, tôi tìm thấy một phương pháp khác nhau mà dường như làm việc:

import UIKit 

class MasterTVC: UITableViewController { 
    @IBOutlet weak var staticCustomCellLabel: UILabel! 

    //viewDidLoad 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.tableView.estimatedRowHeight = 44.0 

     staticCustomCellLabel.text = "This is the text for the static custom cell label; This is the text for the static custom cell label; This is the text for the static custom cell label" 

     //Register handleDynamicTypeChange in observer: self 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "handleDynamicTypeChange:", name: UIContentSizeCategoryDidChangeNotification, object: nil) 
    } 

    //deinit 
    deinit { 
     NSNotificationCenter.defaultCenter().removeObserver(self) 
    } 

    //handleDynamicTypeChange 
    //called when user changes text size in Settings > General > Accessibility > Larger Text 
    //or Settings > Display & Brightness > Text Size 
    func handleDynamicTypeChange(notification: NSNotification) { 
     staticCustomCellLabel.font = UIFont.preferredFontForTextStyle(UIFontTextStyleBody) 

     self.tableView.reloadData() 
    } 

    //tableView:heightForRowAtIndexPath 
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
     return UITableViewAutomaticDimension 
    } 
} 

Về phía Storyboard điều này, các thiết lập bắt đầu với một đơn Xem Bảng điều khiển với các thuộc tính sau:

  • Lớp: MasterTVC (lớp tùy chỉnh của tôi);
  • được chỉ định cho bộ điều khiển chế độ xem ban đầu;
  • Nội dung: Các ô tĩnh;
  • Kiểu: Xử lí
  • Chuyên mục chính: 1.

Phần-1:

  • Rows: 1.

bảng Xem di động:

  • Kiểu: Tuỳ chỉnh (sử dụng cơ bản ở đây làm cho nhãn biến mất khi thay đổi kích thước văn bản trong Settings);
  • Chứa một nhãn UILabel.

Các UILabel là tiếp tục cấu hình như:

  • Font: Body (một loại phong cách năng động);
  • Dòng: 0;
  • Được ghim trên tất cả bốn mặt vào cạnh trên cùng, dưới cùng, bên trái và bên phải của chế độ xem nội dung (tôi đã sử dụng các ràng buộc tương ứng 8, 8, 15, 15);
  • bằng @IBOutlet trong mã lớp tùy chỉnh.

Điều này đã giúp tôi thiết kế cho iOS 9 ở Xcode 7 và Swift 2 với Bố cục tự động được bật. Điều thú vị là nếu bạn loại bỏ mã NSNotificationCenter được sử dụng để phản hồi ngay lập tức với những thay đổi về kích thước văn bản, mã số tự định kích thước cơ bản là hai dòng: thiết lập EstimatedRowHeight trong viewDidLoad và trả về UITableViewAutomaticDimension từ tableView: heightForRowAtIndexPath.

Dựa trên những kết quả này, tôi tin rằng câu trả lời cho câu hỏi ban đầu của tôi là: 1) có; và 2) xem 1.

1

Do đây là một bảng tĩnh, bạn không thể dequeue các tế bào, do đó bạn sẽ phải tạo IBOutlets với họ, tôi muốn giữ chúng trong một mảng như thế này:

@IBOutlet var cells: [UITableViewCell]! 

Sau đó, bạn sẽ phải thực hiện heightForRowAtIndexPath và tính toán kích thước:

var rowSizes: [Int: CGFloat] = [:] 

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return calculateHeightForCell(indexPath) 
} 

func calculateHeightForCell(indexPath: NSIndexPath) -> CGFloat { 

    // check if we already calculated the height 
    if let height = rowSizes[indexPath.row] { 
     return height 
    } 

    // else, calculate it 
    let cell = cells[indexPath.row] 

    let size = cell.contentView.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize) 

    rowSizes[indexPath.row] = size.height 

    return size.height 
} 

rowSizes hành vi giống như một bộ nhớ cache, nó sẽ giữ chiều cao dòng, vì vậy họ sẽ chỉ được tính một lần. Khi thay đổi kích thước phông chữ, chỉ cần bỏ trống rowSizes và làm mới bảng để chúng sẽ được tính toán lại.

15

Chế độ xem bảng tĩnh trả về chiều cao hàng được đặt trong Trình tạo giao diện. Cài đặt tableView.rowHeight dường như bị bỏ qua hoàn toàn. Đây rõ ràng là một lỗi trong UIKit.

Để khắc phục điều đó, chỉ cần ghi đè -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath và trả lại UITableViewAutomaticDimension.

+0

Cảm ơn bạn rất nhiều! – mangerlahn

+0

Bạn có thể đặt 'tableView.rowHeight' thay vì sử dụng hàm đại biểu không? – BallpointBen

+0

@BallpointBen Vui lòng đọc câu thứ hai trong câu trả lời của tôi. – Andy

3

Đầu tiên thêm hai chức năng này trong lớp học của bạn

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return UITableViewAutomaticDimension 
} 

Second để làm cho công việc UITableViewAutomaticDimension chắc chắn rằng bạn đã thêm tất cả các trái, phải, dưới, và những hạn chế cao nhất so với cái nhìn chứa tế bào. Cũng đừng quên đặt số dòng của nhãn thành số không.

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