ลบพื้นที่ว่างก่อนเซลล์ใน UITableView


172

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

ถ้าฉันวางมุมบนซ้ายของUITableViewที่ฉันต้องการให้เซลล์อยู่มันจะไม่ใส่เซลล์ที่นั่น:

ตอนนี้ถ้าฉันเพิ่งย้ายมุมมองตารางขึ้นเพื่อให้เซลล์อยู่ในตำแหน่งที่ถูกต้องฉันจะได้รับปัญหาที่แตกต่าง - เซลล์สามารถเลื่อนขึ้นไปที่นั่นเมื่อเลื่อน (นี่คือนิ้วของฉันเหนือตัวควบคุมการนำทาง):

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

ฉันจะทำสิ่งนี้อย่างไร มีวิธีง่ายกว่านี้ไหม?

คำตอบ:


378

เซลล์ของการUITableViewแสดงบนพื้นที่ว่างเมื่อคุณเลื่อนลงหรือไม่?

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

อีกสิ่งที่ควรทราบคือ iOS จะปรับเนื้อหาของสิ่งที่ใส่เข้าไปสำหรับมุมมองแรกในลำดับชั้นการดูถ้ามันเป็นUIScrollViewหรือมันเป็นลูกหลาน (เช่นUITableViewและUICollectionView) หากลำดับชั้นมุมมองของคุณมีหลายมุมมองเลื่อนautomaticallyAdjustsScrollViewInsetsจะทำการปรับเปลี่ยนเฉพาะมุมมองแรก

นี่คือวิธีการเปลี่ยนพฤติกรรมนี้:

a) เครื่องมือสร้างส่วนต่อประสาน

  • เลือกตัวควบคุมมุมมอง
  • เปิดตัวตรวจสอบคุณสมบัติ
  • มีคุณสมบัติที่เรียกว่า "ปรับมุมมองภาพเลื่อน" ในตัวตรวจสอบคุณสมบัติของ IB (เมื่อเลือกตัวควบคุมมุมมอง) ซึ่งเปิดใช้งานตามค่าเริ่มต้น ยกเลิกการเลือกตัวเลือกนี้:


    (เอื้อเฟื้อภาพโดยDheeraj D )

ฉันไม่แน่ใจว่า Xcode เวอร์ชันใดเปิดตัวเลือกนี้ (ไม่พบในบันทึกย่อประจำรุ่น) แต่อย่างน้อยก็มีในเวอร์ชัน 5.1.1

แก้ไข: เพื่อหลีกเลี่ยงความสับสนนี่เป็นตัวเลือกที่สามที่กล่าวถึงในความคิดเห็น

b) โดยทางโปรแกรม

เพิ่มไปที่เช่นviewDidLoad(เพิ่มเครดิตในคำตอบของSlavco Petkovskiและความคิดเห็นของCris R )

// Objective-C
self.automaticallyAdjustsScrollViewInsets = NO;

// Swift
self.automaticallyAdjustsScrollViewInsets = false

c) สิ่งนี้อาจเกี่ยวข้องกับ schoolers เก่า

คุณสามารถแก้ไขได้โดยการเพิ่ม

tableView.contentInset = UIEdgeInsetsZero

//Swift 3 Change
tableView.contentInset = UIEdgeInsets.zero

หรือถ้าคุณใช้ IB และหากแถบนำทางไม่โปร่งใส (ไม่สามารถบอกได้จากภาพหน้าจอ)

  • เลือกตัวควบคุมมุมมอง
  • เปิดตัวตรวจสอบคุณสมบัติ
  • ในตัวเลือกมุมมองคอนโทรลเลอร์ขยายส่วนขอบยกเลิกการเลือก "ภายใต้แถบด้านบน"

2
การยกเลิกการเลือก "Under Bars" บน UIView นั้นใช้ได้ดีสำหรับฉัน ขอบคุณ
Andreas Øverland

ฉันกำลังโกรธที่ใช้ "Paging Enabled" และตัวเลื่อนจะเลื่อนตามความสูงของแถบนำทางแทนที่จะเป็นทั้งเซลล์ ขอบคุณ
LordParsley

8
ตัวเลือกที่สาม: ยกเลิกการเลือก "ปรับมุมมองภาพเลื่อน" - ทำงานเหมือนมีเสน่ห์ ขอบคุณ lekksi!
Stas Zhukovskiy

2
self.automaticallyAdjustsScrollViewInsets = false ใน Swift working "de pelos"!
Cris R

1
ขอบคุณการตั้งค่าต้องใช้ UIEdgeInsetsZero หากนำตารางในตัวควบคุมตารางใหม่มาใช้ซ้ำทุกครั้งที่แสดงมิฉะนั้นจะมีช่องว่างสีขาวปรากฏขึ้นและใหญ่ขึ้นเรื่อย ๆ
malhal

71

ฉันมีปัญหาเดียวกันนี้และฉันค่อนข้างมั่นใจว่าฉันมี UIView ในจุดหนึ่ง เพียงคัดลอกมุมมองตารางทั้งหมดลบและวางมันอีกครั้งเพื่อแก้ไขให้ฉัน


7
นี่มันแปลกจริงๆจริงๆ วิธีนี้แก้ไขปัญหาได้ ความคิดใด ๆ เมื่อสิ่งนี้เกิดขึ้น?
MiQUEL

ฉันคิดว่าคุณสามารถแก้มันได้ง่ายขึ้นโดยทำตามคำตอบของฉันจาก ต.ค. 10'13
netshark1000

มีปัญหาเดียวกัน การลบและการอ่านข้อมูลก็ทำงานได้สำหรับฉันเช่นกัน
sma

3
เท่าที่ฉันรู้การแทรกเนื้อหาการดูแบบเลื่อนจะถูกปรับโดยอัตโนมัติ (หาก automaticAdjustsScrollViewInsets = YES ซึ่งโดยค่าเริ่มต้นคือ) เฉพาะในกรณีที่มุมมองแบบเลื่อนเป็นลูกคนแรกในลำดับชั้นมุมมองตัวควบคุมมุมมอง ฉันเดาว่าโซลูชันนี้ทำงานได้เนื่องจากหลังจากคัดลอกวางมุมมองตารางแล้วไม่ใช่มุมมองแรกในลำดับชั้นมุมมองอีกต่อไป
lekksi

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

40

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


น่าอัศจรรย์ .. นี่เป็นคำตอบสำหรับฉันอย่างประหลาด .. ฉันเพิ่งคัดลอกและวางคอนโทรลเลอร์มุมมองทั้งหมด แต่อย่างใด tableView ของคอนโทรลเลอร์มุมมองที่วางนี้มีออฟเซ็ตแปลก ๆ คำตอบนี้แก้ปัญหาของฉัน
daisura99

วิธีนี้แก้ไขปัญหาได้ แต่ตอนนี้ส่วนหัวมีลักษณะการทำงานแตกต่างกัน ใคร?
Bruno Muniz

อวยพรคุณ ไม่ว่าคุณจะอยู่ที่ไหนในโลกนี้ อวยพรคุณตลอดไป
gabuchan

9

ในกรณีของฉันฉันมี UILabel ภายใต้ UITableView ในมุมมองลำดับชั้น

ฉันย้ายมัน "ไปข้างหน้า" และพื้นที่ว่างปรากฏ ไม่แน่ใจว่าทำไม แต่ใช้งานได้เช่นนี้หากมีสิ่งใดภายใต้ tableView จะซ่อนพื้นที่ว่าง

นอกจากนี้คุณสามารถลองตรวจสอบ / ปลดล็อค "ปรับมุมมองภาพเลื่อน" บนตัวตรวจสอบตัวควบคุมมุมมองของคุณบนกระดานเรื่องราว

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


2
ฉันมี UITableView ที่จัดกลุ่มไว้และยกเลิกการเลือก "ปรับการเลื่อนดูการแทรก"
Matt

5

ไม่มีสิ่งใดข้างต้นช่วยฉันได้ แต่การทำเช่นนี้ช่วยได้ :

self.tableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0)

แทนที่จะเป็น '-64' คุณสามารถใส่หมายเลขอื่น ๆ ขึ้นอยู่กับความสูงของแถบนำทางของคุณ


4

UIRefreshControlนอกจากนี้อาจจะล่วงหน้าเพิ่ม ฉันมีปัญหากับรหัสเช่นนี้:

self.refreshControl = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your string"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];

}

อย่างที่คุณเห็นฉันตั้งself.refreshControllerขึ้นทันทีหลังจากinit

แต่ถ้าคุณตั้งค่าrefreshControlหลังจากติดตั้งแล้วพื้นที่บนสุดจะไม่รบกวนคุณ

UIRefreshControl *refreshControl  = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your String"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];
    self.refreshControl = refreshControl;
}

ฉันไม่อยากจะเชื่อเลยว่านี่เป็นปัญหาที่แท้จริง เป็นเพียงปัญหาสำหรับฉันที่ <= 9.3.5 คุณคิดยังไงกับโลกนี้?
ไซเรน

4

หากคุณกำลังทำสิ่งนี้บน iOS 11 โดยอัตโนมัติ AdjustsScrollViewInsets จะไม่ทำงานตามที่ได้คัดค้านรหัสต่อไปนี้ใช้ได้กับฉันตามคำตอบในโพสต์นี้: https://stackoverflow.com/a/44391269/5476481

        if #available(iOS 11.0, *) {
            tblView.contentInsetAdjustmentBehavior = .never
        } else {
            automaticallyAdjustsScrollViewInsets = false
        }

หวังว่านี่จะช่วยได้



3

ฉันไม่สามารถพูดได้อย่างแน่นอน แต่ดูเหมือนว่าคุณมี UIView พิเศษค้างอยู่ระหว่างที่ Prototype Cells เริ่มต้นและด้านบนของ UITableView ภาพของฉันเหมือนกับของคุณถ้าคุณลบข้อความ / บรรทัดที่ฉันเพิ่มเข้าไป

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


3

ฉันยังไม่แน่ใจว่าสาเหตุใดที่ทำให้มีพื้นที่พิเศษด้านบน แต่ฉันพบว่าการลบ UITableView ด้วยพื้นที่และแทนที่ด้วยพื้นที่ใหม่นั้นก็ใช้พื้นที่ใหม่

ฉันต้องลาก UIView ไปที่นั่นโดยไม่ตั้งใจ แต่ฉันไม่สามารถเลือกได้ดังนั้นฉันจึงไม่สามารถลบได้


3

สวิฟท์ 5

ลองลบtableHeaderViewและtableFooterView

var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
tblView.tableHeaderView = UIView(frame: frame)
tblView.tableFooterView = UIView(frame: frame)

2

ตรวจสอบเฟรม tableview ของคุณใน storyboard หรือ xib เหมืองโดยค่าเริ่มต้นมีค่าตำแหน่ง ay ดังนั้นข้อผิดพลาด


2

ในแอปพลิเคชันของฉันฉันได้พบปัญหาเช่นนี้แล้ว ฉันได้ตั้งค่าสิ่งที่ขอบด้านบนของ tableView ศูนย์ ยังพยายามตั้งค่าสำหรับfalse automaticallyAdjustsScrollViewInsetsแต่ไม่ได้ผล

ในที่สุดฉันก็ได้วิธีแก้ปัญหา ฉันไม่รู้ว่านี่เป็นวิธีที่ถูกต้อง แต่การใช้heightForHeaderInSectionวิธีการมอบหมายได้ผลสำหรับฉัน คุณต้องส่งคืนค่าที่ไม่เป็นศูนย์เพื่อดำเนินการนี้ (ศูนย์คืนจะแสดงพื้นที่เดิมเหมือนก่อน)

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

    return 0.1
}

2

ในปี 2560 สิ่งที่ใช้ได้ผลกับฉันก็คือบรรทัดนี้

navigationController? .navigationBar.isTranslucent = false

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


นั่นก็ทำเพื่อฉันเช่นกัน ขอบคุณ!
scurioni

2

ใน iOS 11 ขึ้นไปแอปเปิ้ลได้เปลี่ยนคุณสมบัติเพื่อปรับเนื้อหาที่ใส่เข้าไป การใช้งานcontentInsetAdjustmentBehaviorและการตั้งค่า.neverที่จะเอาพื้นที่พิเศษดังกล่าวข้างต้นUICollectionView, ,UIScrollViewUITableView

if #available(iOS 11.0, *) {

    // For scroll view
    self.scrollView.contentInsetAdjustmentBehavior = .never

    // For collection view
    self.collectionView.contentInsetAdjustmentBehavior = .never

    // For table view
    self.tableView.contentInsetAdjustmentBehavior = .never

} else {
    self.automaticallyAdjustsScrollViewInsets = false
}

ฉันหวังว่านี่จะช่วยคุณได้


1

สำหรับฉันปัญหาเกิดขึ้นเมื่อฉันลากเซลล์ต้นแบบจากเมนูไปยังมุมมองตาราง ดังนั้นฉันจึงลบมันและตั้งค่าเซลล์ต้นแบบเป็น 1 ในคุณสมบัติตัวตรวจสอบตารางมุมมอง


1

ฉันกำลังทำสิ่งนี้โดยทางโปรแกรมและฉันก็ย้าย addSubview ของฉัน (tableView) ไปที่ด้านล่างหลังจากเพิ่มการสัมภาษณ์ย่อยอื่น ๆ ทั้งหมดและแก้ไขปัญหาของฉันได้!

ไม่แน่ใจว่าทำไมสิ่งนี้ถึงปรากฏบนอุปกรณ์ไม่ใช่ตัวจำลองของฉัน แต่อย่างน้อยก็มีวิธีง่ายๆ!


1

ตราบใดที่ UITableView ไม่ใช่มุมมองย่อยแรกของตัวควบคุมมุมมองพื้นที่ว่างจะไม่ปรากฏขึ้น

วิธีแก้ไข: เพิ่มวัตถุมุมมองที่ซ่อน / ชัดเจน (มุมมองป้ายชื่อปุ่ม ฯลฯ ) เป็นมุมมองย่อยแรกของตัวควบคุมมุมมอง (ที่ระดับเดียวกับ UITableView แต่ก่อนหน้านั้น)


ฉันใช้เวลามากมายในการพยายามคิดสิ่งนี้ลองทำตามคำแนะนำมากมายที่นี่และในโพสต์อื่น ๆ นี่คือสิ่งที่แก้ไขได้ ขอบคุณ! คุณช่วยอธิบายได้ว่าทำไมหรือโพสต์ลิงค์ไปยังเอกสารบางอย่างที่ทำ ฉันแค่เรียนรู้ iOS dev และมันแตกต่างจาก Android มาก! :)
ทำเครื่องหมาย

0

คุณสามารถแทรก UIView ที่ด้านบนและด้านล่างของตาราง (ลากและวาง) ตั้งค่าคุณสมบัติเป็นโปร่งใสและความสูง 1 px นี่คือการลบส่วนเสริมที่ด้านหน้าเซลล์


0

ฉันยังมีปัญหานี้ tableView ไม่ใช่มุมมองสุดท้ายในลำดับชั้น ในกรณีของฉันฉันมีมุมมองด้านบน (แม้ว่าพวกเขาจะไม่ทับซ้อนกัน) ดังนั้นฉันจึงลากมันไปด้านบน tableView ในลำดับชั้นและทำให้มัน


0

ฉันเพิ่งพบทางออกสำหรับสิ่งนี้

เพียงเลือก tableview และ clic Editor -> Arrange -> Send to Front

มันใช้งานได้สำหรับฉันและหวังว่าจะช่วยให้คุณทุกคน


0

ในกรณีของฉันฉันใช้ ContainerViewController และวาง UITableViewController ไว้ หลังจากลบ ContainerViewController ปัญหาหายไป


0

Xcode 8 bug ...

ลองสิ่งนี้ก่อนถ้าสไตล์สตอรี่บอร์ด UITableView ของคุณถูกตั้งค่าเป็นแบบธรรมดา

ตั้งค่าสไตล์ของตารางเป็น Grouped จากนั้นกลับสู่ Plain นี่เป็นการลบพื้นที่ในแอพของฉันที่หัว UITableView ของฉัน


0

ในกรณีของฉันฉันใช้มุมมองคอนเทนเนอร์ (มุมมองหลัก -> มุมมองคอนเทนเนอร์ -> UITableView)

ฉันคิดว่าพื้นที่พิเศษที่ด้านบนเป็นเหมือนพื้นที่ของแถบการแจ้งเตือนของอุปกรณ์ (ที่แสดงเวลาคือแบตเตอรี่) ฉันทำจริงๆมันไม่ใช่ข้อสันนิษฐาน

สิ่งที่ฉันทำมาจากเครื่องมือสร้าง UI:

  • เลือก Table View Controller ให้สมบูรณ์
  • เปิดตัวตรวจสอบคุณสมบัติ
  • ไปที่ -> View Controller -> Layout -> "Select Wants Full Screen"

0

คุณสามารถใช้รหัสนี้ใน viewDidLoad หรือ viewDidAppear ตำแหน่งที่สร้างตารางของคุณ:

// Remove blank space on header of table view
 videoListUITableView.contentInset = UIEdgeInsetsZero;

// The iOS device = iPhone or iPod Touch
CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

// Set the height of the table on the basis of number of rows
videoListUITableView.frame = CGRectMake(videoListUITableView.frame.origin.x, videoListUITableView.frame.origin.y, videoListUITableView.frame.size.width, iOSDeviceScreenSize.height-100);



// Hide those cell which doesn't contain any kind of data
self.videoListUITableView.tableFooterView = [[UIView alloc] init];


0

ตั้งค่า Extended Edges ในกระดานเรื่องราวเพื่อไม่underTopBarให้มีการตรวจสอบคุณสมบัติ


0

มีปัญหาเดียวกัน ฉันแก้ไขมันโดยเพิ่มสิ่งต่อไปนี้ใน viewDidLoad

self.extendedLayoutIncludesOpaqueBars = true


-2

ตรวจสอบ

if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [tableView setSeparatorInset:UIEdgeInsetsZero];
}
  • พูดถึงฟังก์ชั่นตัวแทน tableview cellForRowAtIndexPath:
  • มันสามารถจัดการได้ทั้ง iOS 6 และ 7
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.