Trước đó tôi phải nói rằng tôi thực sự có hiệu ứng hiển thị mà tôi muốn nhưng không theo cách thỏa mãn, ngay bây giờ, các ràng buộc cần phải "bị hỏng" thay vì được cập nhật đúng cách.Chế độ xem không cập nhật sau khi thay đổi ràng buộc bố cục tự động theo lập trình
Tôi có một ViewController chứa một UITableView. Chiều cao của tableView
có thể thay đổi từ 0 (không hiển thị) đến bất kỳ số lượng hàng mà nó nắm giữ. Chiều cao được tính trong viewDidLoad của ViewController() bằng cách nhân số hàng hiện tại theo chiều cao của hàng.
Điều đầu tiên tôi đã thử đang tạo một @IBOutlet weak var tableHeightConstraint: NSLayoutConstraint!
được kết nối với giới hạn chiều cao được đặt trong bảng phân cảnh. Nó có chỉ số chiều cao ban đầu ngẫu nhiên nhưng nó được cập nhật với giá trị đúng trong phạm vi của ViewController viewDidLoad()
tiếp theo phương pháp cập nhật xem nếu cần thiết:
tableHeightConstraint = NSLayoutConstraint(item: tableView, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 0, constant: calculatedTableViewHeight)
// At this point I've tried a variety of methods like the following two but actually none has worked for me
view.layoutIfNeeded()
// or
view.updateConstraints()
// or
view.layoutSubviews()
... và ngay cả những phương pháp tương tự trên tableView chỉ để đảm bảo cũng như đặt tất cả những thứ này vào viewDidLayoutSubviews()
thay thế.
Vì vậy, những gì tôi đã thử tiếp theo là tạo ra cùng một ràng buộc như trên nhưng thay vì cập nhật tôi chỉ cần thêm nó vào chế độ xem: view.addConstraint(tableHeightConstraint)
. Điều này thực sự đã có hiệu ứng hình ảnh mong muốn nhưng trong các bản ghi tôi nhận được một cuộc xung đột của hai ràng buộc chiều cao này dẫn đến một sự phá vỡ của một trong những ban đầu. Vì mục tiêu của tôi là lấy mã đúng và sạch mà tôi đã cố gắng. Vì vậy, lần này tôi lần đầu tiên loại bỏ các ràng buộc từ xem trước khi thêm một điều chỉnh một lần nữa. Nhìn bề ngoài, một lần nữa, mọi thứ đều hoàn hảo nhưng tôi vẫn không loại bỏ được những ràng buộc xung đột. Vì vậy, câu hỏi thực tế của tôi là (ngoài những gì tôi đã làm sai cho đến nay) làm thế nào tôi có thể - tốt hơn - chỉ cập nhật một ràng buộc hiện có theo sau là một cập nhật/chuyển tiếp thích hợp của khung nhìn và các phần phụ của nó tại bất kỳ thời điểm nào, cho dù đó là khi lần đầu tiên tôi tải chế độ xem hoặc liệu tôi có muốn thay đổi một số ràng buộc khi người dùng tương tác hay không. Cảm ơn rất nhiều vì đã giúp đỡ!
Đặt thuộc tính thành ràng buộc mới không loại bỏ ràng buộc cũ, nó chỉ làm cho con trỏ của bạn trỏ đến điểm mới, đó là lý do tại sao bạn nhận được các ràng buộc xung đột. Bạn nên làm điều đó như trong câu trả lời của @cmyr. – rdelmar
@rdelmar Ok, hiểu rồi, cảm ơn lời giải thích này! Nhưng tại sao vẫn còn một xung đột khi đi tới 'view.removeConstraint (tableHeightConstraint)', tạo ra một cái mới và thêm nó một lần nữa vào khung nhìn bởi 'view.addConstraint (tableHeightConstraint)'? Chỉ vì lý do hiểu biết ... –
Xem trong tuyên bố đó là gì? Có phải self.view của controller không? Giới hạn chiều cao mà bạn thực hiện trong bảng phân cảnh được thêm vào chế độ xem bạn đặt chiều cao của, chế độ xem bảng trong trường hợp của bạn (không phải trên màn hình giám sát). Bạn đã thử, self.tableView.removeConstraint (tableHeightConstraint)? Người mới cũng nên được thêm vào chế độ xem bảng. – rdelmar