ทำไมถึงมีช่องว่างภายในเพิ่มเติมที่ด้านบนของ UITableView ของฉันด้วยสไตล์ UITableViewStyleGrouped ใน iOS7


635

เริ่มต้นใน iOS7 มีพื้นที่เพิ่มเติมที่ด้านบนของฉันUITableView's UITableViewStyleGroupedที่มีสไตล์

นี่คือตัวอย่าง:

ป้อนคำอธิบายรูปภาพที่นี่

Tableview เริ่มต้นที่ลูกศรแรกมีการเติมเต็มพิกเซลที่ไม่ได้อธิบาย 35 พิกเซลจากนั้นส่วนหัวสีเขียวจะถูกUIViewส่งคืนโดยviewForHeaderInSection(ที่ส่วนคือ 0)

ใครสามารถอธิบายได้ว่าจำนวนพิกเซล 35 มาจากไหนและฉันจะกำจัดได้โดยไม่เปลี่ยนเป็นUITableViewStylePlainอย่างไร


บันทึก:

ใน iOS 11 และใหม่กว่า:

tableView.contentInsetAdjustmentBehavior = .never

คุณใช้ iOS 7 ล่าสุดหรือไม่ บางส่วนของประเภทที่ไม่สอดคล้องกันเหล่านี้ (แต่ไม่ใช่ทั้งหมดและอาจไม่ใช่แบบนี้) ได้รับการรักษาในระหว่างการแสดงตัวอย่าง dev ภายหลัง ฉันควรรู้: ฉันผัดวันประกันพรุ่งจากปัญหาบางอย่างที่หายไป
Dan Rosenstark

ตรวจสอบคำตอบได้ที่นี่ - stackoverflow.com/a/18986158/1463604
Nishant

คำตอบสั้น ๆ คือการขยายเพิ่มเติมพิเศษอาจเป็นเพราะส่วนหัวของมุมมองตาราง (ไม่ใช่ส่วนหัวของส่วน) และUITableViewไม่ต้องการกำหนดส่วนหัวที่มีความสูง 0.0 ตรวจสอบstackoverflow.com/a/31223403/1394534สำหรับรายละเอียดเพิ่มเติม
Aurelien Porte

30
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, CGFLOAT_MIN)];หมายเหตุ: 0.0fจะถูกละเว้นหากคุณใช้ความสูงของ rect ดังนั้นเราจึงใช้ CGFloat ที่ใกล้เคียงที่สุดกับศูนย์ที่เป็นไปได้ (อย่างน้อยสิ่งนี้ "ได้ผล" สำหรับฉัน ... ไม่ใช่ทางออกที่ดีที่สุด)
Alejandro Iván

1
@ AlejandroIvánความคิดเห็นของคุณเพิ่งทำให้คืนของฉัน ฉันมี tableView พร้อมต้นแบบที่จัดกลุ่ม ฉันใช้ numberSections = data.count และการตั้งค่า numberRows = 1 ฉันตั้งค่า heightForFooterInSection เพื่อสร้างพื้นที่ว่างระหว่างแต่ละรายการและด้วยเหตุผลบางอย่างที่ทำให้ TableHeaderView ว่างปรากฏขึ้น
Ryan Alexander

คำตอบ:


863

ฉันได้รับความช่วยเหลือจากสิ่งต่อไปนี้:

YouStoryboard.storyboard> YouViewController> แอตทริบิวต์ตัวตรวจสอบ> ยกเลิกการเลือก - ปรับมุมมองการเลื่อน

ป้อนคำอธิบายรูปภาพที่นี่


42
ฉันคิดว่านี่เป็นวิธีที่ถูกต้องในการลบช่องว่างภายในนั้นแทนที่จะแก้ไขด้วยค่า edgeInset
Hgeg

21
สิ่งนี้ไม่ได้ผลสำหรับฉัน - ฉันมี navBar ทึบแสงด้านบนและสิ่งนี้ถูกปิดผลักเนื้อหาภายใต้
slycrel

5
collectionviewไม่ทำงานเมื่อใช้กำหนดเอง (เมื่อcollectionviewcell
มองเห็นโต๊ะ

5
ไม่ได้ผลสำหรับฉัน มีเพียงสิ่งเดียวที่ทำงานได้เปลี่ยนเป็นธรรมดาแทนที่จะจัดกลุ่ม
shim

28
ฉันมีปัญหานี้กับ TableViewController ภายในมุมมองคอนเทนเนอร์ ฉันต้องตั้งค่าคุณสมบัตินี้ไม่ได้โดยตรงบน TableViewController ซึ่งฝังอยู่ แต่ในตัวควบคุมมุมมองที่มีมุมมองภาชนะ จากนั้นก็ใช้งานได้
Andy Mortimer

325

ผมเล่นรอบกับมันอีกเล็กน้อยและดูเหมือนว่านี้เป็นผลข้างเคียงของการตั้งค่าของ tableHeaderView = niltableView

เนื่องจาก tableView ของฉันปรากฏขึ้นแบบไดนามิกtableHeaderViewเมื่อฉันต้องซ่อนtableHeaderViewแทนที่จะทำself.tableView.tableHeaderView = nil;ฉันจึง:

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.bounds.size.width, 0.01f)];

ฉันชอบวิธีนี้ดีกว่าการตั้งค่าโดยพลการค่อนข้างcontentInset.topเพราะฉันใช้contentInset.topแบบไดนามิกเช่นกัน ต้องจำไว้ว่าให้ลบ 35px พิเศษเมื่อใดก็ตามที่ฉันคำนวณใหม่contentInset.topเป็นที่น่าเบื่อ


4
สุดยอดทางออก! แน่นอนว่าคุณต้องตั้งค่าเป็น 0.01f เพื่อกำจัดมุมมองตารางมุมมองเริ่มต้นเช่นเดียวกับในรหัสของคุณ
Simone Manganelli

2
BTW ซึ่งสามารถทำได้ด้วยการลากและวางหนึ่งครั้งในเครื่องมือสร้างส่วนต่อประสาน อย่างไรก็ตามขอบคุณ! :)
Rudolf Adamkovič

8
คุณสมควรได้รับเหรียญสำหรับสิ่งนี้
Vaibhav Gautam

7
โปรดจำไว้ว่ามุมมองความสูง 0.01f ที่ด้านบนของมุมมองตารางของคุณจะหมายถึงเซลล์ทั้งหมดที่อยู่ข้างในนั้นไม่ตรงแนว (เซลล์แรกที่มีต้นกำเนิด Y เป็น 0.01, ถัดจาก cell_height + 0.01 เป็นต้น) ดังนั้นเนื้อหาของเซลล์เหล่านั้น จะถูกจัดวางผิดแนว (เปิดDebug > Color Misaligned Imagesเครื่องจำลองเพื่อดูสิ่งนี้ด้วยตัวคุณเอง) คุณไม่ต้องการทำเช่นนั้น
Simon Whitaker

2
จะดีกว่าที่จะใช้UITableViewHeaderFooterViewแทน UIView และใช้CGFLOAT_MINงานได้เหมือนกัน0.01fแต่ดีกว่าในทางทฤษฎี
Jaybo

178

สำหรับ IOS 7 หากคุณจัดสรร tableview ในตัวควบคุม view คุณอาจมองเข้าไป

self.edgesForExtendedLayout = UIRectEdgeNone;

ปัญหาของคุณคล้ายกับของฉัน

ปรับปรุง:

Swift ใน iOS 9.x:

self.edgesForExtendedLayout = UIRectEdge.None

สวิฟท์ 3:

self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)

3
UITableViewทำงานบนที่ราบของฉัน ปัญหาที่เกิดขึ้นจากความจริงที่ฉันUITableViewอยู่บนUIViewControllerภายในUINavigationControllerซึ่งก่อให้เกิดเนื้อหาตารางเพื่อวางลง 44 navBarจุดเพื่อให้เนื้อหาเริ่มต้นก็ไม่ได้ขึ้นอยู่เบื้องหลัง ถึงแม้ว่ามันไม่จำเป็นสำหรับเค้าโครงของฉันดังนั้นมันจึงทำให้เกิดปัญหา ในที่สุดฉันก็เปลี่ยนรหัสautomaticallyAdjustsScrollViewInsetsซึ่งใช้งานได้เช่นกัน
DBD

คุณสมบัตินี้จะใช้เฉพาะเพื่อดูตัวควบคุมที่ฝังอยู่ในคอนเทนเนอร์เช่น UINavigationController ตัวควบคุมมุมมองรูทของหน้าต่างไม่ตอบสนองต่อคุณสมบัตินี้ ค่าเริ่มต้นของคุณสมบัตินี้คือทั้งหมด .. ฉันรู้สึกว่าค่าเริ่มต้นควรเป็น 0 หรือไม่ สิ่งนี้มีข้อดีตรงไหน
Desh_

5
สง่างามยิ่งขึ้นกับ Swift 3:edgesForExtendedLayout = []
Dave Batton

สวัสดี @yeahdixon คุณใช้ซอฟต์แวร์อะไรในการสร้างลูกศรสีชมพู? ขอบคุณล่วงหน้า
iArezki

174

ลองเปลี่ยนcontentInsetทรัพย์สินที่สืบทอดมาจากUITableViewUIScrollView

self.tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);

มันเป็นวิธีแก้ปัญหา แต่ก็ใช้งานได้


6
contentTableView.contentInset = UIEdgeInsetsMake(-20, 0, -20, 0);ทำงานได้ดีที่สุดสำหรับฉันเพราะมีพิกเซลพิเศษ 20 จุดที่ด้านบนและด้านล่าง
Brian

1
แม้ว่าวิธีการแก้ปัญหา "กำลังดุร้าย" นี้ใช้งานได้ แต่ฉันคิดว่าควรจัดอันดับที่ต่ำกว่า
eladleb

134
self.automaticallyAdjustsScrollViewInsets = NO;

ลองคุณสามารถจัดการกับมัน!


มันใช้งานได้ดีในการซ่อน tableHeaderView ใน iOS 7.0 แต่มันไม่รองรับในเวอร์ชั่นที่เก่ากว่า
Brian

ใช้งานได้ดีภายใต้ iOS 7
StackRunner

3
สิ่งสำคัญ: ตรวจสอบให้แน่ใจว่าคุณทำเช่นนี้ในคอนโทรลเลอร์มุมมองคอนเทนเนอร์หาก UITableView ของคุณวางอยู่บนคอนโทรลเลอร์ที่ฝังอยู่ในคอนโทรลเลอร์อื่นแล้วให้ทำเช่นนี้ในคอนโทรลเลอร์ด้านบนที่ฝังไม่ตรงกับตำแหน่งที่คุณวาง UITableView ดูแลสิ่งต่าง ๆ )
James Stone

uncheck Adjust scroll view insetsนี้จะดีกว่า เพราะบางครั้งเราไม่ใช้กระดานเรื่องราวเพื่อสร้าง UI ของเรา
JW.ZG

มันใช้งานได้สำหรับฉัน ฉันแนบมุมมองไปที่แถบนำทางและ tableview มันไม่ได้เกิดขึ้นใน iOS 11 แต่เกิดขึ้นใน iOS 10 ขอบคุณ
dobiho

78

คุณสามารถตรวจพบว่าแอปของคุณกำลังใช้งาน iOS7 หรือสูงกว่าและเพิ่มสองวิธีนี้ในการมอบหมายมุมมองตาราง (โดยปกติจะอยู่ในรหัส UIViewController ของคุณ)

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

นี่อาจไม่ใช่ทางออกที่สง่างาม แต่ใช้ได้สำหรับฉัน

รุ่น Swift:

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

1
สิ่งนี้ใช้ได้สำหรับฉัน UITableView เพิ่มพื้นที่ด้านบนด้วยเหตุผลที่แตกต่างกันมากมาย โดยเฉพาะที่เกี่ยวข้องกับ OP ปัญหาจะเกิดขึ้นเฉพาะกับมุมมองตารางสไตล์ที่จัดกลุ่ม และวิธีนี้แก้ไขปัญหาได้
RajV

5
คุณสามารถใช้ CGFLOAT_MIN แทน 0.001 ซึ่งให้ค่าสัมบูรณ์ของ CGFloat ที่เล็กที่สุด
eiKatte

2
นี่คือคำตอบที่ถูกต้องเนื่องจากคุณลักษณะที่แท้จริงคือการ
แพ็ดดิ้ง

ควรทำเครื่องหมายเป็นคำตอบที่ถูกต้อง วิธีการมอบหมายเพื่อแทนที่และตอบคำถาม อย่างน้อยก็ลองทำสิ่งนี้ก่อนถ้าคุณอ่านสิ่งนี้ไกล ๆ แฮ็คทั้งหมด ลองทวีต: - (CGFloat) tableView: (UITableView *) tableView heightForHeaderInSection: (NSInteger) ส่วน {// กลับ CGFLOAT_MIN; ผลตอบแทน 30.0f }
Matthew Ferguson

ดี! เป็นโบนัสหากคุณต้องการให้ส่วนหัวเล็ก ๆ อยู่ด้านบนและอีกมากระหว่างส่วนที่จัดกลุ่มคุณสามารถใช้สิ่งต่อไปนี้:override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return section == 0 ? 14 : 24 }
Freek Sanders

55

ฉันพบสาเหตุของข้อผิดพลาดเดิมของฉันและสร้างโครงการตัวอย่างที่แสดงมัน ฉันเชื่อว่ามีข้อบกพร่องใน iOS7

ตั้งแต่ iOS7 ถ้าคุณสร้าง UITableView ด้วยสไตล์จัดกลุ่ม แต่ไม่มีชุดผู้ได้รับมอบหมายในเค้าโครงแรกจากนั้นคุณตั้งผู้แทนจำหน่ายและโทร reloadData จะมีพื้นที่ 35px ที่ด้านบนซึ่งจะไม่มีวันหายไป

ดูโครงการนี้ฉันได้แสดงข้อผิดพลาด: https://github.com/esilverberg/TableViewDelayedDelegateBug

ไฟล์นี้โดยเฉพาะ: https://github.com/esilverberg/TableViewDelayedDelegateBug/blob/master/TableViewDelayedDelegateBug/ViewController.m

หากบรรทัด 24 ทำงาน

[self performSelector:@selector(updateDelegate) withObject:nil afterDelay:0.0];

จะมีพื้นที่เพิ่มขึ้น 35 px ที่ด้านบน หากบรรทัด 27 แอ็คทีฟและ 24 ถูกคอมเม้นต์

self.tableView.delegate = self;

ไม่มีที่ว่างด้านบน มันเหมือนกับที่ tableView กำลังแคชผลลัพธ์ไว้ที่ใดที่หนึ่งและไม่ได้วาดตัวเองใหม่หลังจากที่ผู้รับมอบสิทธิ์ถูกตั้งค่าและเรียกใช้ reloadData


21
ฉันจะเพิ่มว่าแม้ว่าจะมีผู้รับมอบสิทธิ์ แต่ผู้รับมอบสิทธิ์tableView:heightForHeaderInSection:และtableView:heightForFooterInSection:ส่งกลับค่า 0 คุณก็จะมีปัญหานี้เช่นกัน การใช้วิธีการโปรโตคอลด้านบนและส่งคืน 0.01f แก้ไขให้ฉัน
John Estropia

1
ใช่!! ฉันได้ลองวิธีแก้ปัญหาที่เรียกว่า 3 และนี่คือหนึ่งในนั้น! ยอดเยี่ยมขอบคุณ: D
Henrik Erlandsson

สมบูรณ์ ทุกคนรายงานข้อผิดพลาดเพราะฉันคิดว่านี่ไม่ใช่พฤติกรรมที่ตั้งใจ
Pushparaj

หาที่ดี! สิ่งนี้ยังคงเกิดขึ้นใน iOS 9 (เราไม่ได้ใช้ XIB) แต่การตั้งค่าผู้รับมอบสิทธิ์เมื่อเริ่มต้นแก้ไขระยะห่าง (ไม่ใช่ใน loadView หรือ viewDIdLoad) ขอบคุณ!
John Stricker

1
การตั้งค่าความสูงโดยประมาณสำหรับส่วนหัวช่วยฉันได้
Viktor

49

ยกเลิกการเลือก "ปรับมุมมองการเลื่อน"

ป้อนคำอธิบายรูปภาพที่นี่


ฉันต้องการตัวเลือกนี้สำหรับ View Controller ตัวอื่นของฉันและเห็นได้ชัดว่าเมื่อฉันสร้าง VC ใหม่การเปลี่ยนแปลงที่เกิดขึ้น ขอบคุณสำหรับสิ่งนี้!
David

ใช่ ใช้งานได้เพียงตั้งไว้ใน ContainerView และใช้งานได้!
Felipe FMMobile

46

อีกความคิดเห็นอย่างรวดเร็ว ... แม้ใน XCode 6.1 มีข้อผิดพลาดที่มีช่องว่างในแนวตั้งปรากฏที่ด้านบนของที่UIScrollViews, และUITextViewsUITableViews

ป้อนคำอธิบายรูปภาพที่นี่

บางครั้งวิธีเดียวในการแก้ไขปัญหานี้คือไปที่กระดานเรื่องราวแล้วลากตัวควบคุมปัญหามาใช้เพื่อไม่ให้เป็นมุมมองย่อยแรกบนหน้าเว็บอีกต่อไป

ป้อนคำอธิบายรูปภาพที่นี่

(ขอบคุณOded ที่ชี้ให้ฉันในทิศทางนี้ ... ฉันโพสต์ความคิดเห็นนี้เพื่อเพิ่มภาพหน้าจอไม่กี่ภาพเพื่อแสดงอาการและแก้ไข)


1
โปรดทราบว่าข้อผิดพลาดข้อผิดพลาดปัญหานี้เกิดขึ้นใน iOS 8 หากคุณมี UITextView เป็นตัวควบคุมย่อยแรกในหน้าของคุณ ... ดังนั้นมันจึงไม่ใช่แค่ปัญหาของ UITableView
Mike Gledhill

1
ทางออกทั้งหมดแฮ็คนี้ใช้ได้สำหรับฉันเท่านั้น การแก้ไขที่แปลกไปสู่ข้อผิดพลาดที่แปลก ฉันประสบปัญหานี้ด้วย UITableview
Mesbah

4
1 ล้านขอบคุณ! นี่เป็นทางออกเดียวที่ใช้ได้สำหรับฉัน
user139816

1
(ฉันประหลาดใจใน 18 เดือนต่อมาและผู้อ่านยังคงโหวตคำตอบนี้ Apple ยังไม่ได้แก้ไขปัญหานี้อย่างจริงจังหรือยัง!!)
Mike Gledhill

1
ช่วยชีวิตฉันไว้! ขอบคุณ คุณรู้หรือไม่ว่าใช้เวลานานแค่ไหนในการค้นหา "ตัวแก้ไข" ตัวน้อยนี้ grrh
Mc.Stever

40

ตามคู่มือการเปลี่ยนแปลงนี้สำหรับ iOS7โดย Apple ข้อมูลแทรกของมุมมองแบบเลื่อนจะถูกปรับโดยอัตโนมัติ ค่าเริ่มต้นของAutomaticAdjustsScrollViewInsetsถูกตั้งค่าเป็น YES

UIViewController ซึ่งมี UITableView ควรตั้งค่าคุณสมบัตินี้เป็น NO

self.automaticallyAdjustsScrollViewInsets = NO;

นี้จะทำเคล็ดลับ

แก้ไข 1:

นอกจากนี้หนึ่งสามารถลอง -

self.navigationController.navigationBar.translucent = YES;

นอกจากนี้ยังลบช่องว่างภายในเสริมด้านบน


คำตอบที่ดีมากนอกเสียจากว่าจะไม่ตอบคำถาม Esilver พูดถึงช่องว่าง 35px แต่ iOS7 เพิ่มส่วนหัว 20px เพิ่มเติม: เท่ากับความสูงของแถบสถานะ
มาร์ติน

ปัญหาไร้สาระ ขอบคุณสำหรับคำตอบ.
Genki

นี่คือคำตอบของปัญหาที่แตกต่าง
entonio

ขอบคุณมันใช้งานได้สำหรับฉันในกรณีของฉันฉันมี tableviewcontroller ฝังอยู่ใน viewcontroller และโดยการตั้งค่า automaticAdjustsScrollViewInsets = false ใน viewcontroller ช่องว่างด้านบนหายไป
Alexey

39

ขณะใช้ TableView ที่จัดกลุ่มใช้สิ่งนี้เพื่อหลีกเลี่ยงการตัดขอบใน viewWillAppear

self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);

พยายามทั้งหมดอื่น ๆ นี่คือสิ่งที่ใช้งานได้! ขอบคุณ
Michael

36

คำตอบก่อนหน้าจำนวนมากข้างต้นนั้นแฮ็คเกินไป พวกเขาจะแตกหักได้ตลอดเวลาในอนาคตหาก Apple ตัดสินใจที่จะแก้ไขพฤติกรรมที่ไม่คาดคิดนี้

รากของปัญหา:

  1. UITableViewไม่ชอบที่จะมีส่วนหัวที่มีความสูง 0.0 เป็น หากสิ่งที่คุณพยายามจะทำคือการมีส่วนหัวที่มีความสูงเป็น 0 คุณสามารถข้ามไปยังโซลูชัน

  2. แม้ว่าในภายหลังคุณจะกำหนดความสูงที่ไม่ใช่ 0.0 ให้กับส่วนหัวของคุณ a UITableViewก็ไม่ต้องการที่จะกำหนดส่วนหัวที่มีความสูงเป็น 0.0 ในตอนแรก

สารละลาย:

จากนั้นการแก้ไขที่ง่ายและน่าเชื่อถือที่สุดคือการตรวจสอบให้แน่ใจว่าความสูงส่วนหัวของคุณไม่ใช่ 0 เมื่อคุณกำหนดให้กับมุมมองตารางของคุณ

สิ่งนี้จะทำงาน:

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, CGFLOAT_MIN)];
self.tableView.tableHeaderView = tableViewHeaderView;

บางสิ่งเช่นนี้อาจนำไปสู่ปัญหาในบางจุด (โดยทั่วไปหลังจากการเลื่อน):

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;

ในที่สุดฉันก็พบคำตอบที่ได้ผล ขอบคุณ นอกจากนี้ฉันได้เรียนรู้ว่าtableView.tableHeaderViewจริง ๆ แล้วเป็นมุมมองอุปกรณ์เสริมเหนือเนื้อหาแถว ฉันสับสนกับหัวข้อตลอดจนคำตอบของคุณออกมา
Joe Huang

1
CGFLOAT_MINถูกแทนที่ด้วยCGFloat.leastNormalMagnitudeใน Swift 3
Clay Ellis

29

Storyboard:

เพียงแค่ยกเลิกการเลือก: Adjust Scroll View Insetsในตัวเลือกของ View Controller

ป้อนคำอธิบายรูปภาพที่นี่

รหัส:

self.automaticallyAdjustsScrollViewInsets = false

2
ใช้ xcode 7 ฉันไม่เห็นผู้ตรวจสอบคุณสมบัติ> เลย์เอาต์ฉันควรเพิ่ม self.automaticallyAdjustsScrollViewInsets = false อย่างไร
alex

ในมุมมองโหลดแล้ว
CW0007007

23

นี่เป็นวิธีแก้ปัญหาสำหรับ iOS 10 ที่ใช้ Swift 3:

คุณสามารถกำจัดบนและด้านล่าง paddings UITableViewDelegateโดยการใช้วิธีการต่อไปนี้จาก

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{ 
    return CGFloat.leastNormalMagnitude
}

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
{
   return CGFloat.leastNormalMagnitude
}

หน้าสองของ SO ช่วยฉัน .... ฉันไม่รู้ว่าทำไมอาจเป็นเพราะ AutomaticDimension อาจเป็นเพราะข้อ จำกัด ของ VFL แต่อย่างใดขอบคุณ! ozi bua ist brav! : D
Pentarex

เหล่านี้เป็นส่วนหัวและท้ายกระดาษ คำถามเกี่ยวข้องกับส่วนหัวของตารางทั้งหมด นอกจากนี้ยังไม่มีอะไรพิเศษเฉพาะกับ Swift3 หรือ iOS 10 ในวิธีการมอบหมายอย่างใดอย่างหนึ่ง
Nicolas Miari

14

ในกรณีของฉันนี่คือสิ่งที่ช่วยฉัน ฉันสนับสนุน ios6 ด้วย

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars = NO;
    self.automaticallyAdjustsScrollViewInsets = NO;
}

ไม่แน่ใจว่าสิ่งนี้ทำอะไร แต่มันทำงานได้อย่างสมบูรณ์ คุณช่วยอธิบายหน่อยได้ไหม?
Matt Wolfe

@ MattWolfe ฉันหลงทางและพบทางออกนี้ไม่แน่ใจว่าทำไมสิ่งนี้ถึงเกิดขึ้น ฉันเดาว่าตัวควบคุมกำลังตัดสินใจว่า tableview จำเป็นต้องมี inset เนื่องจากแถบสถานะ (หรือในกรณีอื่น ๆ toolbar / tabbar) ดังนั้นมันจึงเพิ่มเข้าไปโดยอัตโนมัติ ฉันกำลังดิ้นรนกับ "คุณสมบัติ" iOS7 ใหม่บางอย่าง อาจมีบางคนเข้าใจและมีคำอธิบายที่แท้จริงเกี่ยวกับเรื่องนี้?
ลูคัส

ใช้เวลาช่วง 2 วันสุดท้ายในการย้ายแอพขนาดเล็กไปยัง iOS 7 และยังคงมีปัญหาเล็กน้อย .. ฉันแก้ไขใน iOS 7 มันแบ่งเป็น 6 และในทางกลับกัน .. ขับรถฉันถั่ว!
Matt Wolfe

นี่เป็นปัญหาที่แตกต่างจาก OP แม้จะมีสิ่งนี้สำหรับมุมมองตารางที่จัดกลุ่มพื้นที่พิเศษจะถูกเพิ่มที่ด้านบน
RajV

1
นี่น่าจะเป็นกุญแจสำคัญ: self.automaticallyAdjustsScrollViewInsets = NO; เพียงแค่ตั้งค่าที่ลบพื้นที่พิเศษที่ฉันมี
Mike M

14

เพียงเพิ่มสิ่งต่อไปนี้ใน viewDidLoad ของคุณใน VC:

self.automaticallyAdjustsScrollViewInsets = NO;

การแก้ไขนี้ใช้งานได้และฉันต้องการตั้งค่าการแทรกด้วยตนเองโดยใช้หมายเลขเวทย์มนตร์ ขอบคุณ!
imobilizer

14

ดังนั้นฉันจึงลองทุกวิธีที่นี่และครั้งนี้ไม่มีใครช่วย กรณีของผมเป็นมุมมองตารางการจัดกลุ่มบน iOS 9. ผมไม่ทราบจริงๆว่าทำไมและวิธีฉันพบนี้ แต่สำหรับผมแล้วการตั้งค่าtableViewHeaderที่มีUIViewอย่างน้อย0.01ความสูงทำงานออก CGRectZeroไม่ได้ช่วยอะไรจริงๆ:

tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))

10

Swift: iOS ฉันมี tableview บน scroll view .. เมื่อฉันคลิก "Back" บนหน้าจอเดียวกัน เลื่อนดูใช้พื้นที่มากขึ้น .. เพื่อแก้ปัญหานี้ฉันได้ใช้:

 self.automaticallyAdjustsScrollViewInsets = false

ค่าบูลีนที่ระบุว่าตัวควบคุมมุมมองควรปรับมุมมองการเลื่อนโดยอัตโนมัติหรือไม่ ค่าเริ่มต้นเป็นจริงซึ่งช่วยให้ตัวควบคุมมุมมองเพื่อปรับมุมมองเลื่อนของมันเพื่อตอบสนองต่อพื้นที่หน้าจอที่ใช้โดยแถบสถานะแถบนำทางและแถบเครื่องมือหรือแถบแท็บ ตั้งค่าเป็นเท็จถ้าคุณต้องการที่จะจัดการการปรับมุมมองภาพเลื่อนด้วยตัวคุณเองเช่นเมื่อมีมุมมองเลื่อนมากกว่าหนึ่งมุมมองในลำดับชั้นมุมมอง


10

ขอบคุณคำตอบโดย @Aurelien Porte นี่คือทางออกของฉัน

สาเหตุของปัญหานี้: -

  1. UITableView ไม่ต้องการมีส่วนหัวที่มีความสูง 0.0 หากสิ่งที่คุณพยายามทำคือการมีส่วนหัวที่มีความสูงเป็น 0 คุณสามารถข้ามไปยังโซลูชัน
  2. แม้ว่าในภายหลังคุณจะกำหนดความสูงที่ไม่ใช่ 0.0 ให้กับส่วนหัวของคุณ UITableView ไม่ต้องการกำหนดส่วนหัวที่มีความสูง 0.0 เป็นครั้งแรก

ใน ViewDidLoad: -

self.edgesForExtendedLayout = UIRectEdge.None

self.automaticallyAdjustsScrollViewInsets = false

ไม่ต้องการอะไรอย่างนี้: -

self.myTableview.contentInset = UIEdgeInsetsMake(-56, 0, 0, 0)

ในheightForHeaderInSectionตัวแทน: -

if section == 0
    {
        return 1
    }
    else
    {
        return 40; // your other headers height value
    }

ในviewForHeaderInSectionตัวแทน: -

if section == 0 
{  
   // Note CGFloat.min for swift
   // For Objective-c CGFLOAT_MIN 
   let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.myShaadiTableview.bounds.size.width, CGFloat.min)) 
   return headerView
}
else
{ 
   // Construct your other headers here 
}

10

นี่คือวิธีที่สามารถแก้ไขได้อย่างง่ายดายในiOS 11และXcode 9.1ผ่าน Storyboard:

เลือกมุมมองตาราง> ตัวตรวจสอบขนาด> ส่วนแทรกเนื้อหา: ไม่


1
ทำงานให้ฉัน :)
bhupinder

ที่ดี! ขอบคุณ :)
Saeed Ir

1
นี่คือแทนที่จะเป็นautomaticallyAdjustsScrollViewInsetsใน ios 11
Nik Kov

9

ฉันถือว่าเป็นเพียงส่วนหนึ่งของUITableViewStyleGroupedสไตล์ใหม่ มันอยู่ในมุมมองตารางที่จัดกลุ่มไว้ทั้งหมดและดูเหมือนจะไม่มีวิธีใดที่จะควบคุมพื้นที่นั้นได้โดยตรง

หากพื้นที่นั้นถูกแสดงโดย a UIViewมันจะเป็นไปได้ที่จะค้นหาผ่านทั้งหมดsubviewsของUITableViewเพื่อค้นหามุมมองเฉพาะนั้นและแก้ไขโดยตรง อย่างไรก็ตามยังมีความเป็นไปได้ว่าพื้นที่นั้นเป็นเพียงฮาร์ดโค้ดที่มีการชดเชยก่อนส่วนหัวและเซลล์เริ่มต้นและไม่มีวิธีแก้ไขใด ๆ

ในการค้นหาข้อมูลย่อยทั้งหมด (ฉันจะเรียกใช้รหัสนี้เมื่อตารางไม่มีเซลล์เพื่อให้ง่ายต่อการอ่านผลลัพธ์):

- (void)listSubviewsOfView:(UIView *)view {

    // Get the subviews of the view
    NSArray *subviews = [view subviews];

    // Return if there are no subviews
    if ([subviews count] == 0) return;

    for (UIView *subview in subviews) {

        NSLog(@"%@", subview);

        // List the subviews of subview
        [self listSubviewsOfView:subview];
    }
}

3
หาก UITableViews (เฉพาะเจาะจงมากขึ้นUITableViewCellScrollView) บน iOS7 สอนสิ่งหนึ่งให้เราก็คือการปล่อยให้ลำดับชั้นการดูของคลาสที่มีอยู่แล้วภายในตัวเอง
Matthias Bauch

จุดดี. อีกตัวเลือกหนึ่งคือ ... เพื่อแฮ็ค iOS อย่างต่อเนื่อง;)
Dan Rosenstark

อ๊ะ หมายถึงเขียนคำเตือนนั้น แต่ลืมไป
เควิน

เควิน - ฉันคิดว่าคุณพูดถูกการออกแบบ ปรากฏว่าการคืนค่า 0 สำหรับ heightForHeaderInSection เป็นวิธีที่ง่ายที่สุดในการลบการขยายนี้ ด้วยเหตุผลบางอย่างเกี่ยวกับอินสแตนซ์นั้นมันไม่ทำงานสำหรับฉัน แต่ทำงานกับ UITableViews อื่น ๆ
esilver

1
มันแน่นอน "โดยการออกแบบ" หากคุณหยุดการทำงานชั่วคราวและทำงาน: po [((UIApplication *)UIApplication.sharedApplication).keyWindow recursiveDescription]คุณจะเห็นว่าส่วนหัวของตารางหรือส่วนหัวส่วนแรกหรือเซลล์แรก (ขึ้นอยู่กับสิ่งที่คุณใช้) โดยธรรมชาติจะปล่อยให้เส้นขอบ 35px ....
นาย T

9

คำตอบของฉันจะเป็นคำตอบทั่วไปมากขึ้น แต่สามารถใช้ได้กับสิ่งนี้เช่นกัน

ถ้ามุมมองรูท (ของViewController ) หรือลูกแรก (มุมมองย่อย)ของมุมมองรูทเป็นคลาสย่อยของ UIScrollView (หรือ UIScrollView ตัวเอง) และถ้า

self.navigationController.navigationBar.translucent = YES;

กรอบจะตั้งค่าโดยอัตโนมัติก่อนการคำนวณ contentInset


เพื่อหลีกเลี่ยงปัญหานี้คุณสามารถทำได้

self.automaticallyAdjustsScrollViewInsets = NO;

แต่ในกรณีของฉันฉันไม่สามารถทำเช่นนี้ได้เพราะฉันใช้ SDK ซึ่งมีส่วนประกอบ UIView ซึ่งนักพัฒนาอื่นสามารถใช้งานได้ องค์ประกอบ UIView นั้นมี UIWebView (ซึ่งมี UIScrollView เป็นมุมมองย่อยแรก) หากองค์ประกอบนั้นถูกเพิ่มเป็นลูกคนแรกในลำดับชั้นการดูของ UIViewController ระบบจะใช้การแทรกอัตโนมัติโดยระบบ

ฉันได้แก้ไขสิ่งนี้ด้วยการเพิ่มมุมมองดัมมีด้วยเฟรม (0,0,0,0)ก่อนเพิ่ม UIWebView

ในกรณีนี้ระบบไม่พบคลาสย่อยของ UIScrollView เป็นมุมมองย่อยแรกและไม่ได้ใช้สิ่งที่ใส่เข้าไป


livesaver! ขอบคุณself.automaticallyAdjustsScrollViewInsets = false
ethanneff

8

รหัสนี้ใช้ได้สำหรับฉันคำตอบที่ดีที่สุดสำหรับฉันที่เขียนไว้objective-Cข้างบนดังนั้นฉันจึงแปลงเป็น Swift

สำหรับ Swift 4.0+

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: 0.01))

เพียงแค่เขียนสิ่งนี้ลงไปviewDidLoad()และมันจะทำงานเหมือนมีเสน่ห์


1
ขอบคุณมากทำงานได้ดีสำหรับฉัน
Ângelo Polotto

1
ยินดีต้อนรับการเข้ารหัสที่มีความสุขของคุณ
Vipul Kumar

7

ฉันมีการแก้ไขเช่นเดียวกับ arielyz เมื่อฉันย้าย UITableView ไม่ใช่มุมมองย่อยของมุมมองพาเรนต์มันก็หายไป Space ของฉันคือ 20 px ไม่ใช่ 35

ฉันไม่สามารถสร้างมันขึ้นมาใหม่ในแนวตั้งรูปทรง Xib ได้เพียงแนวนอนเท่านั้น ฉันจะส่งข้อผิดพลาดเรดาร์ในภายหลังถ้าฉันสามารถทำซ้ำได้ในแอพตัวอย่างที่เรียบง่าย


พบปัญหาเดียวกันไม่สามารถแก้ไขได้ด้วยการเปลี่ยน contentInset แต่วิธีนี้ใช้ได้ผลแม้ว่าจะแฮ็คค่อนข้างสวยก็ตาม สำหรับสิ่งที่คุ้มค่าการใช้เครื่องมือตรวจแก้จุดบกพร่องทางภาพฉันสามารถเห็นได้ว่าในขณะที่ UITableView มีความสูงที่เหมาะสม UITableViewWrapper ที่อยู่ภายในนั้นไม่ได้
Mic Fok

สมบูรณ์ แก้ไขข้อผิดพลาดสำหรับฉันใน XCode 6.1 ไม่มีคำแนะนำอื่น ๆ ในหน้า StackOverflow นี้ที่สร้างความแตกต่างใด ๆ ฉันมี UITableView ภายใน UIView และเป็นมุมมองย่อยแรก การลากเพื่อให้เป็นมุมมองย่อยที่ 2 แก้ไขได้อย่างสมบูรณ์ (หากใครต้องการฉันฉันจะอยู่ในผับ)
Mike Gledhill

ขอบคุณ! สิ่งนี้ยังใช้งานได้หากคุณมีตัวควบคุมมุมมองตารางภายในคอนเทนเนอร์ การย้ายคอนเทนเนอร์เพื่อไม่ให้เป็นอันดับแรกในมุมมองพาเรนต์จะลบช่องว่างที่ด้านบนของมุมมองตาราง
strangeluck

7

ฉันคิดว่าการทำ UIEdgeInsets -35 0 0 0 น่าเบื่อ ในกรณีของฉันฉันใช้ tableView: heightForHeaderInSection: method และมีศักยภาพที่จะกลับ 0

เมื่อฉันเปลี่ยน 0 เป็น 0.1f ปัญหาเพิ่งหายไป


1
ถ้าฉันทำได้ฉันจะลงคะแนนมากกว่าหนึ่งครั้ง ต้องเป็นความผิดพลาดอัตโนมัติ autolayout แปลก ๆ หรืออะไรบางอย่าง ... เป็นอะไร> 0 งานฉันขอแนะนำแทนที่จะใช้ 0.1 FLT_EPSILON หรือ DBL_EPSILON เพราะเห็นว่าทั้งสองเป็นตัวแทนของค่าบวกเล็ก ๆ เช่น 1.0 + epsilon! = 1.0
Henri Normak

7

สิ่งเดียวที่ใช้ได้ผลสำหรับฉันคือ:

รวดเร็ว :

tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0

วัตถุประสงค์ -C :

self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;

นอกจากนี้ฉันยังมีพื้นที่เพิ่มเติมสำหรับส่วนแรก นั่นเป็นเพราะฉันใช้tableHeaderViewคุณสมบัติไม่ถูกต้อง แก้ไขปัญหานี้ด้วยการเพิ่ม:

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01))

ทำงานได้สำหรับฉันสำหรับ Swift 4.2 ขอบคุณ
Sylar

พยายามทุกอย่างในหน้านี้สำหรับ iOS13 ที่จัดกลุ่มมุมมองตารางพร้อมมุมมองส่วนหัว self.tableView.tableHeaderView = UIView (เฟรม: CGRect (x: 0, y: 0, ความกว้าง: tableView.frame.size.width, ความสูง: 0.01)) แก้ไขปัญหา
Ning

7

Swift 4 code: สำหรับ tableview ที่ไม่มีส่วนหัวคุณสามารถเพิ่ม code นี้ได้:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

และคุณจะได้ระยะห่างส่วนหัวเป็น 0

หากคุณต้องการให้ส่วนหัวของส่วนสูงเฉพาะของคุณส่งผ่านค่านั้น:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return header_height
}

และมุมมองจากผู้มอบหมาย viewForHeaderinSection


สิ่งนี้ไม่ตอบคำถาม คำถามคือเกี่ยวกับที่มาของระยะห่างพิเศษไม่ใช่วิธีกำจัดมัน
Stephen Newell

สิ่งแปลกคือถ้าคุณกลับ 0 ในความสูง ForHeaderInsection คุณยังได้รับพื้นที่พิเศษนี้ มันทำงานได้สมบูรณ์แบบกับ CGFloat.leastNormalMagnitude (จำนวนบวกน้อยที่สุด)
ShadeToD

7

จะเฉพาะเจาะจงในการลบพื้นที่ tableviewHeader จากด้านบนฉันทำการเปลี่ยนแปลงเหล่านี้:

YouStoryboard.storyboard> YouViewController> เลือก TableView> ตัวตรวจสอบขนาด> การแทรกเนื้อหา - ตั้งค่าเป็นไม่เคย

ป้อนคำอธิบายรูปภาพที่นี่


ข้อมูลเพิ่มเติมนอกเหนือจากสกรีนช็อตเมื่อเปรียบเทียบกับคำตอบนี้คืออะไร
Artjom B.

มันเหมือนกันฉันเดาฉันไม่พบคำตอบนั้นเมื่อฉันกำลังมองหาวิธีแก้ปัญหา ฉันควรลบคำตอบแล้ว ..
user832

ไม่ใช่ถ้าคุณสามารถขยายคำตอบของคุณได้เล็กน้อยโดยอธิบายว่าเพราะเหตุใด Content insets = ไม่แก้ปัญหานี้ได้จริง (ตัวเลือกนี้ทำงานอย่างไร)
Artjom B.

เมื่อส่วนแทรกเนื้อหาถูกตั้งค่าเป็นไม่เคย tableView จะไม่เลื่อนขึ้นไปบนการแก้ไขฟิลด์ข้อความ
mojtaba al moussawi

6

ใช้อันนี้ฉันคิดว่านี่ช่วยได้ ...

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
 {
    return 0.005f;// set this according to that you want...
 }

1
ยอดเยี่ยม! ใช้งานได้อย่างมีเสน่ห์ใน iOS 9.2 คำตอบนี้สมบูรณ์แบบเนื่องจากในบางกรณีฉันต้องระงับส่วนหัวแรกในขณะที่คนอื่นแสดง ฉันเห็นคำตอบอื่นโดยใช้ CGFloat.min นั่นก็ใช้ได้เช่นกัน ดังนั้น viewController ของฉันตอนนี้สามารถให้จำนวนจริงเช่น 44.0 หรือ 0 เป็นหลัก
เดวิด H

6
override func viewWillAppear(animated: Bool) {
        self.edgesForExtendedLayout = UIRectEdge.None

 //  OR

self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);

   //OR

 self.automaticallyAdjustsScrollViewInsets = false
        }

automaticAdjustsScrollViewInsets = งานที่ผิดพลาดจากฉัน! ขอบคุณ!
Daniel Kuta
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.