วิธีปิดการใช้งานการเลื่อนในตาราง UITableView เมื่อเนื้อหาเหมาะสมกับหน้าจอ


240

ฉันมีตาราง (จัดกลุ่มสไตล์) ไม่กี่ตารางในแอพ iphone ของฉัน (เฉพาะบางส่วนของหน้าจอและเพิ่มด้วยInterface Builderแม้ว่าจะไม่ได้รับการจัดประเภทย่อยUITableViewController) ว่า 80% ของเวลามีขนาดเล็กและจะพอดีกับหน้าจอ เมื่อตารางพอดีกับหน้าจอฉันต้องการปิดใช้งานการเลื่อนเพื่อให้มันสะอาดขึ้นเล็กน้อย แต่ถ้าตารางหลุดออกจากหน้าจอ (เมื่อเพิ่มแถวเข้าไปในภายหลัง) ฉันต้องการเปิดใช้งานการเลื่อนอีกครั้ง (เพราะไม่เช่นนั้นคุณจะไม่เห็นเนื้อหานั้น)

มีวิธีทำเช่นนี้หรือไม่? ฉันดูเหมือนจะไม่สามารถคิดออก ฉันรู้ว่าต้องทำ:

tableView.scrollEnabled = NO;

แต่ฉันไม่แน่ใจว่าที่ไหนหรือถ้าฉันต้องคำนวณขนาดวัตถุตารางหรือบางสิ่งบางอย่างเพื่อให้มันทำงาน


อัปเดต : ต่อไปนี้เป็นโซลูชันที่ใช้งานได้ในที่สุดสำหรับฉัน:

if (table.contentSize.height < table.frame.size.height) {
   table.scrollEnabled = NO;
 }
else {
   table.scrollEnabled = YES;
 }

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

table.frame.size.heightคือขนาดที่แท้จริงของวัตถุ (คุณสามารถเห็นสิ่งนี้ในInterface Builder) ปรากฏบนหน้าจอในขณะtable.contentSize.heightที่ความสูงของ: ส่วนหัว, ส่วนท้ายและส่วนสูงของเซลล์ทุกเซลล์เข้าด้วยกัน


1
ขอบคุณ ทางออกนั้นใช้ได้สำหรับฉัน อย่างไรก็ตามฉันสิ้นสุดการขยาย UITableView และแทนที่ reloadData เพื่อปิดใช้งาน scrollEnabled เหตุผลก็คือโหลดมุมมองตารางเมื่อสร้างตัวควบคุมมุมมองของฉัน ด้วยวิธีนี้คุณไม่ต้องเรียก reloadData สองครั้ง
Brandon O'Rourke

@ JoeBlow ฉันคิดว่าคุณพลาดจุดของ OP คำถามไม่ใช่วิธีปิดการใช้งานการตีกลับเป็นวิธีการเปิดใช้งานการเลื่อนเท่านั้น (และการตีกลับมีแนวโน้มมากที่สุด) เมื่อมุมมองตารางต้องเลื่อน
Kyle Clegg

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

ควรมี: if (table.contentSize.height <= table.frame.size.height)
Grzegorz Krukowski

คำตอบ:


396

ฉันคิดว่าคุณต้องการตั้งค่า

tableView.alwaysBounceVertical = NO;

6
สิ่งนี้ทำงานได้ดีกว่า contentSize <frame เมื่อคุณใช้ AutoLayout ควรเป็นคำตอบที่ได้รับการยอมรับ
Joshua Dance

1
ฉันใช้เลย์เอาต์อัตโนมัติและคำตอบนี้เป็นสิ่งที่ฉันต้องการ
Golden Thumb

3
ดีกว่าปิดการใช้งานการเลื่อน
Kirit Vaghela

5
ทำงานเหมือนมีมนต์ขลังคุณสามารถปิดการใช้งานได้interface builderโดยการไม่ตีกลับและตีกลับในแนวนอน / แนวตั้ง
Ahsan Ebrahim

11
สำหรับ Swift - tableView.alwaysBounceVertical = false
swiftBoy

44

คุณสามารถตรวจสอบจำนวนเซลล์ที่มองเห็นได้โดยใช้ฟังก์ชั่นนี้:

- (NSArray *)visibleCells

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

tableView.scrollEnabled = NO;

ดังที่ @Ginny พูดถึง .. เราอาจมีปัญหากับเซลล์ที่มองเห็นได้บางส่วนดังนั้นโซลูชันนี้จะทำงานได้ดีขึ้นในกรณีนี้:

tableView.scrollEnabled = (tableView.contentSize.height <= CGRectGetHeight(tableView.frame));

ในกรณีที่คุณใช้ autoLayout โซลูชันนี้ทำงาน:

tableView.alwaysBounceVertical = NO.

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

6
คิดออก! กลับกลายเป็นว่าคุณไม่สามารถใช้เซลล์ที่มองเห็นได้จริง ๆ เลยเนื่องจากปัญหาเซลล์ที่มองเห็นได้บางส่วน แต่สิ่งนี้ใช้งานได้: if (table.contentSize.height < table.frame.size.height)>> ดูการแก้ไขในโพสต์ต้นฉบับ
จินนี่

42

ในสวิฟต์:

tableView.alwaysBounceVertical = false

18
ฉันมักจะอัปโหลดa̶n̶s̶w̶e̶r̶s̶เช่น "rewrites" ดังกล่าวเสมอเนื่องจากการแปลงเป็นไวยากรณ์สมัยใหม่ต้องใช้เวลา
Dmitry Isaev

14

ดังนั้นจึงมีหลายคำตอบและต้องการเนื้อหาทั้งหมดพร้อมกันดังนั้นฉันจึงเพิ่มคำตอบนี้:

หากคุณกำลังใช้ AutoLayout โดยการตั้งค่านี้จะทำงานให้คุณเท่านั้น:

  • ในรหัส:

tableView.alwaysBounceVertical = false

  • หรือในเครื่องมือสร้างส่วนต่อประสาน:

เพียงค้นหาตัวเลือกนี้และตัวเลือกuntick" Bounce Vertically"

นี่คือการอ้างอิง:

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

หากคุณไม่ได้ใช้ AutoLayout:

 override func viewDidLayoutSubviews() {
    // Enable scrolling based on content height
    tableView.isScrollEnabled = tableView.contentSize.height > tableView.frame.size.height
 }

13

ลองนี้

[yourTableView setBounces:NO];

@kyle - ขอบคุณสำหรับการบันทึก! - แต่ดูว่าเป็นสิ่งที่เกิดขึ้นโดยอัตโนมัติ ถ้ามันสั้นกว่าหน้าจอ (หรือที่ยึดอื่น ๆ ) มันจะไม่เลื่อน (และแน่นอนจะไม่เด้งเลยเพราะมันจะไม่เลื่อนแม้แต่) ถ้ามันยาวกว่าหน้าจอก็จะเลื่อน (และเด้งแน่นอน) ไม่ ??
Fattie

บางทีฉันอาจใช้มุมมองคอลเลกชันมากเกินไป ... บางทีมันอาจจะเป็นไปตามที่ฉันอธิบายสำหรับมุมมองคอลเล็กชัน แต่ไม่ใช่สำหรับ UITableView ??
Fattie

9

คุณสามารถตั้งค่าเปิด / ปิดการใช้งานเด้งหรือเลื่อนมุมมองตารางโดยเลือก / ยกเลิกการเลือกเหล่านี้ในพื้นที่เลื่อนดู

เลื่อนดูพื้นที่แก้ไข


3

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


3

// Enable scrolling based on content height self.tableView.scrollEnabled = table.contentSize.height > table.frame.size.height;


3
ฉันคิดว่าฉันรู้แจ้งหลังจากอ่านวิธีแก้ปัญหาของคุณแล้ว ขอบคุณมาก
Arash

ฉันใช้สิ่งนี้ในมุมมองของฉันAppApp
มาเรีย

1
ฉันหมายถึง viewDidLayoutSubviews ไม่ใช่ viewAppid
มาเรีย

0

ความสูงเริ่มต้นคือ 44.0f สำหรับเซลล์ tableview ที่ฉันเชื่อ คุณต้องมีแหล่งข้อมูลของคุณอยู่ในมือในแถวลำดับ? จากนั้นตรวจสอบว่า[array count]*44.0fอยู่นอกเหนือขอบเขตที่กำหนดหรือไม่และหากตั้งค่าไว้ให้ตั้งค่าtableview.scrollEnabled = NOอื่นเป็น YES ทำที่ที่คุณคิดแหล่งข้อมูลสำหรับมุมมองตารางนั้น


เซลล์ตารางของฉันมีขนาดแตกต่างกัน (และอาจเปลี่ยนขนาดได้ตลอดเวลาฉันใช้วิธี heightForRowAtIndexPath) ดังนั้นฉันอาจไม่ต้องการ hardcode 44.0f ฉันเชื่อว่าหมายเลขนั้นเหมือนกับ tableView.rowHeight อยู่ดี
จินนี่

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

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