iOS 8.0 giới thiệu thuộc tính layoutMargins trên các ô VÀ chế độ xem bảng.
Thuộc tính này không khả dụng trên iOS 7.0, vì vậy bạn cần đảm bảo kiểm tra trước khi gán nó!
Cách khắc phục dễ dàng là phân lớp ô của bạn và ghi đè thuộc tính lề bố cục theo đề xuất của @ user3570727. Tuy nhiên, bạn sẽ mất mọi hành vi hệ thống như kế thừa lợi nhuận từ Vùng an toàn, vì vậy tôi không đề xuất giải pháp dưới đây:
(Mục tiêu)
-(UIEdgeInsets)layoutMargins {
return UIEdgeInsetsZero // override any margins inc. safe area
}
(nhanh 4.2):
override var layoutMargins: UIEdgeInsets { get { return .zero } set { } }
Nếu bạn không muốn ghi đè lên tài sản hoặc cần đặt nó một cách có điều kiện, hãy tiếp tục đọc.
Ngoài thuộc layoutMargins
tính, Apple đã thêm một thuộc tính vào ô của bạn để ngăn không cho nó kế thừa các cài đặt lề của Chế độ xem bảng của bạn. Khi thuộc tính này được đặt, các ô của bạn được phép định cấu hình lề riêng của chúng độc lập với chế độ xem bảng. Hãy nghĩ về nó như một ghi đè.
Thuộc tính này được gọi preservesSuperviewLayoutMargins
và thiết lập nó NO
sẽ cho phép layoutMargin
cài đặt của ô ghi đè lên bất cứ thứ gì layoutMargin
được đặt trên TableView của bạn. Cả hai đều tiết kiệm thời gian ( bạn không phải sửa đổi cài đặt của Chế độ xem bảng ) và ngắn gọn hơn. Vui lòng tham khảo câu trả lời của Mike Abdullah để được giải thích chi tiết.
LƯU Ý: những gì tiếp theo là một triển khai rõ ràng cho cài đặt lề cấp độ ô , như được thể hiện trong câu trả lời của Mike Abdullah. Đặt ô của preservesSuperviewLayoutMargins=NO
bạn sẽ đảm bảo rằng Chế độ xem bảng của bạn không ghi đè cài đặt ô. Nếu bạn thực sự muốn toàn bộ chế độ xem bảng của mình có lề nhất quán, vui lòng điều chỉnh mã của bạn cho phù hợp.
Thiết lập lề di động của bạn:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
// Remove seperator inset
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
// Prevent the cell from inheriting the Table View's margin settings
if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
[cell setPreservesSuperviewLayoutMargins:NO];
}
// Explictly set your cell's layout margins
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
Swift 4:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
// Remove seperator inset
if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
cell.separatorInset = .zero
}
// Prevent the cell from inheriting the Table View's margin settings
if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
cell.preservesSuperviewLayoutMargins = false
}
// Explictly set your cell's layout margins
if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
cell.layoutMargins = .zero
}
}
Đặt thuộc preservesSuperviewLayoutMargins
tính trên ô của bạn thành KHÔNG sẽ ngăn chế độ xem bảng của bạn ghi đè lên lề của ô. Trong một số trường hợp, nó dường như không hoạt động đúng.
Nếu tất cả đều thất bại, bạn có thể ép buộc lề của Chế độ xem bảng:
-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
// Force your tableview margins (this may be a bad idea)
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
}
Swift 4:
func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Force your tableview margins (this may be a bad idea)
if tableView.responds(to: #selector(setter: UITableView.separatorInset)) {
tableView.separatorInset = .zero
}
if tableView.responds(to: #selector(setter: UITableView.layoutMargins)) {
tableView.layoutMargins = .zero
}
}
...Và ở đó bạn đi! Điều này sẽ hoạt động trên iOS 7 và 8.
EDIT: Mohamed Saleh mang đến cho tôi sự thay đổi có thể có trong iOS 9. Bạn có thể cần phải đặt Chế độ xem bảng cellLayoutMarginsFollowReadableWidth
thành NO
nếu bạn muốn tùy chỉnh phần trong hoặc lề. Số dặm của bạn có thể thay đổi, điều này không được ghi chép lại rất tốt.
Thuộc tính này chỉ tồn tại trong iOS 9, vì vậy hãy chắc chắn kiểm tra trước khi cài đặt.
if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}
Swift 4:
if myTableView.responds(to: #selector(setter: self.cellLayoutMarginsFollowReadableWidth)) {
myTableView.cellLayoutMarginsFollowReadableWidth = false
}
(mã trên từ dấu phân cách UITableView của iOS 8 không hoạt động )
EDIT: Đây là một cách tiếp cận Trình tạo giao diện thuần túy:
LƯU Ý: iOS 11 thay đổi và đơn giản hóa phần lớn hành vi này, một bản cập nhật sẽ đến ...