iOS 8.0 แนะนำคุณสมบัติ layoutMargins บนเซลล์และมุมมองตาราง
คุณสมบัตินี้ไม่มีใน iOS 7.0 ดังนั้นคุณต้องตรวจสอบให้แน่ใจก่อนทำการกำหนด!
การแก้ไขที่ง่ายคือซับคลาสเซลล์ของคุณและแทนที่คุณสมบัติระยะขอบเลย์เอาต์ตามที่แนะนำโดย @ user3570727 อย่างไรก็ตามคุณจะสูญเสียการทำงานของระบบใด ๆ เช่นการสืบทอดมาร์จิ้นจากพื้นที่ปลอดภัยดังนั้นฉันไม่แนะนำวิธีแก้ไขด้านล่าง:
(objectivec)
-(UIEdgeInsets)layoutMargins {
return UIEdgeInsetsZero // override any margins inc. safe area
}
(รวดเร็ว 4.2):
override var layoutMargins: UIEdgeInsets { get { return .zero } set { } }
หากคุณไม่ต้องการแทนที่คุณสมบัติหรือต้องการตั้งค่าตามเงื่อนไขให้อ่านต่อไป
นอกเหนือจากlayoutMargins
คุณสมบัตินั้น Apple ได้เพิ่มคุณสมบัติลงในเซลล์ของคุณที่จะป้องกันไม่ให้สืบทอดการตั้งค่าระยะขอบของมุมมองตารางของคุณ เมื่อตั้งค่าคุณสมบัตินี้เซลล์ของคุณจะได้รับอนุญาตให้กำหนดระยะขอบของตนเองโดยไม่ขึ้นกับมุมมองตาราง คิดว่ามันเป็นการแทนที่
คุณสมบัตินี้ถูกเรียกใช้preservesSuperviewLayoutMargins
และการตั้งค่าNO
ให้อนุญาตการlayoutMargin
ตั้งค่าของเซลล์เพื่อแทนที่สิ่งที่layoutMargin
ตั้งค่าไว้ใน TableView ของคุณ ทั้งสองช่วยประหยัดเวลา ( คุณไม่ต้องแก้ไขการตั้งค่าของมุมมองตาราง ) และกระชับมากขึ้น โปรดอ้างอิงคำตอบของ Mike Abdullah สำหรับคำอธิบายโดยละเอียด
หมายเหตุ: สิ่งต่อไปนี้เป็นการใช้งานที่สะอาดสำหรับการตั้งค่าระยะขอบในระดับเซลล์ดังที่แสดงในคำตอบของ Mike Abdullah การตั้งค่าเซลล์ของคุณpreservesSuperviewLayoutMargins=NO
จะทำให้แน่ใจว่ามุมมองตารางของคุณไม่ได้แทนที่การตั้งค่าเซลล์ หากคุณต้องการให้มุมมองตารางทั้งหมดของคุณมีระยะขอบที่สอดคล้องกันโปรดปรับรหัสของคุณตามนั้น
ตั้งค่าระยะห่างของเซลล์:
-(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];
}
}
สวิฟท์ 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
}
}
การตั้งค่าpreservesSuperviewLayoutMargins
คุณสมบัติในเซลล์ของคุณเป็น NO ควรป้องกันไม่ให้มุมมองตารางของคุณแทนที่ส่วนต่างของเซลล์ ในบางกรณีดูเหมือนว่าจะทำงานไม่ถูกต้อง
หากทุกอย่างล้มเหลวคุณอาจบังคับให้มาร์จิ้นมุมมองตาราง:
-(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];
}
}
สวิฟท์ 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
}
}
... และไปที่นั่น! สิ่งนี้ควรใช้กับ iOS 7 และ 8
แก้ไข: โมฮาเหม็ซาเลห์มาถึงความสนใจของฉันมีการเปลี่ยนแปลงที่เป็นไปได้ใน iOS 9.คุณอาจจะต้องตั้งค่ามุมมองของตารางcellLayoutMarginsFollowReadableWidth
ไปNO
ถ้าคุณต้องการที่จะปรับแต่งขุ่นหรืออัตรากำไรขั้นต้น ไมล์สะสมของคุณอาจแตกต่างกันซึ่งไม่ได้มีการบันทึกไว้อย่างดี
คุณสมบัตินี้มีอยู่เฉพาะใน iOS 9 ดังนั้นโปรดตรวจสอบก่อนการตั้งค่า
if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}
สวิฟท์ 4:
if myTableView.responds(to: #selector(setter: self.cellLayoutMarginsFollowReadableWidth)) {
myTableView.cellLayoutMarginsFollowReadableWidth = false
}
(โค้ดด้านบนจากส่วนแทรก iOS 8 UITableView ตัวแทรก 0 ไม่ทำงาน )
แก้ไข: นี่คือวิธีการสร้างส่วนต่อประสานที่บริสุทธิ์:
หมายเหตุ: การเปลี่ยนแปลง iOS 11 & ทำให้พฤติกรรมนี้ง่ายยิ่งขึ้นการอัปเดตจะมีขึ้น ...