IOS7: UIScrollView offset ใน UINavigationController


126

ขณะนี้ฉันกำลังย้ายแอปของฉันบน iOS 7 และฉันติดอยู่เป็นเวลาหลายชั่วโมงในการจัดการตัวควบคุม / แถบนำทางใหม่

ก่อนหน้านี้เมื่อเรามีตัวควบคุมการนำทางเรามีตัวอย่างข้อมูลดังนี้:

UINavigationController *navController = [[UINavigationController alloc]initWithRootViewController:[[MainViewController alloc]init]];

ในตัวสร้างอินเทอร์เฟซเรามีตัวเลือกในการตั้งค่าแถบนำทางที่มีอยู่สำหรับมุมมองและทุกอย่างตรงกับเนื้อหาของมุมมองจริง

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


ตัวสร้างอินเทอร์เฟซ _________________________ และผลลัพธ์


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

ตัวสร้างอินเทอร์เฟซ _________________________ และผลลัพธ์

ฉันเดาว่าฉันพลาดอะไรบางอย่างที่นี่จริงๆ แต่ฉันไม่พบหัวข้อหรือข้อมูล Apple ในคู่มือการเปลี่ยน iOS7 เกี่ยวกับเรื่องนั้น

ขอบคุณสำหรับความช่วยเหลือของคุณ


แก้ไข

ดังที่เราเห็นในภาพลูกคนแรกของมุมมองคือ UIScrollView ซึ่งมีป้ายกำกับทั้งสองปัญหาจะไม่ปรากฏขึ้นเมื่อไม่มีมุมมองแบบเลื่อน นอกจากนี้ยังปรากฏหากเป็น UITableView หากป้ายกำกับอยู่นอก UIScrollView จะไม่มีการชดเชยป้ายกำกับนั้น


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

ฉันไม่ได้ใช้ Autolayout จริง ๆ แต่การใช้มัน (ติ๊กช่องทำเครื่องหมาย) ไม่สามารถแก้ปัญหาได้
สตรีม

ด้วย Autolayout คุณต้องกำหนดข้อ จำกัด เพื่อให้มุมมองยังคงอยู่ Xcode ไม่ทราบว่าคุณต้องการอะไรโดยอัตโนมัติ
erdekhayser

เมื่อเห็นการแก้ไขครั้งก่อนของคุณฉันเพิ่งค้นพบปัญหาของคุณ น่าเสียดายที่ไม่ใช่วิธีแก้ปัญหาที่ชัดเจนที่สุด แทนที่จะพยายามอธิบายซ้ำทั้งหมดฉันใช้วิดีโอนี้บน Youtube เพื่อเรียนรู้วิธีตั้งค่ามุมมองแบบเลื่อน youtube.com/watch?v=PgeNPRBrB18&feature=youtu.be ขอให้โชคดี ฉันใช้เวลาสองสามครั้งในการดูมันเพื่อให้เข้าใจอย่างถ่องแท้ว่าเขากำลังทำอะไร
erdekhayser

คำตอบ:


286

ตกลงดังนั้นฉันพบวิธีแก้ปัญหาฉันได้ตั้งค่าคุณสมบัติในคอนโทรลเลอร์ของฉัน:

self.automaticallyAdjustsScrollViewInsets = false

ฉันไม่เข้าใจประโยชน์ที่แท้จริงของคุณสมบัตินี้ (หรือทำไมค่าเริ่มต้นจึงเป็นจริง)

เอกสารเดียวที่ฉันพบคือ:

ปรับปรุง

ใน iOS 11 automaticallyAdjustsScrollViewInsetsเลิกใช้งานแล้ว

ตอนนี้คุณควรใช้:

self.tableView.contentInsetAdjustmentBehavior = .never

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


12
การค้นพบที่ยอดเยี่ยม UIScrollView ในสตอรีบอร์ดมีความซับซ้อนมาก ฉันหวังว่า Apple จะทำให้ Xcode เวอร์ชันอนาคตเป็นไปอย่างราบรื่น
p0lAris

4
รหัสนี้ป้องกันไม่ให้ฉันUIScrollViewเลื่อน แต่ถ้าไม่มีสิ่งนี้ฉันไม่สามารถกำจัดออฟเซ็ตได้ Weired ...
horrorguy

9
นอกจากนี้ยังสามารถปิดแฟล็กนี้ได้ในสตอรี่บอร์ด / ปลายปากกาของคุณ View Controller จะมีช่องทำเครื่องหมาย "Adjust Scroll View Insets" ฉันเอาหัวโขกกับกำแพงมานานแล้วในการพยายามแยกแยะปัญหาเกี่ยวกับมุมมองแบบเลื่อนและรูปแบบอัตโนมัติที่ซับซ้อนมากขึ้นด้วยการรองรับ iOS 6 และ 7 ขอบคุณมากที่ให้วิธีแก้ปัญหาในที่สุด!
Newtz

2
เอกสารแอพจะบอกคุณว่าการตั้งค่า navigationbar.translucent = YES จะป้องกันไม่ให้ navigationbar ดันเนื้อหาลง มันเป็นการโกหกที่ยิ่งใหญ่ที่สุดและทำให้ฉันเสียเวลาทำงานหลายชั่วโมงจนกระทั่งโพสต์นี้ นอกจากนี้คุณต้องตั้งค่า self.automaticallyAdjustsScrollViewInsets = NO; ขอบคุณสำหรับโพสต์นี้ !!!!!!! แอปเปิ้ลและแอปเปิ้ล?
user779764

ฉันพบว่าสิ่งนี้ทำให้ขอบเขตของ UIScrollView ของฉันเลื่อนลงตามความสูงของแถบนำทาง (-64 จุด) ฉันลบล้างสิ่งนี้ด้วยตนเองเป็น 0 แต่พบว่า UISrollView ยังคงเลื่อนในแกน y และ "สแนป" ไปที่เส้นจินตภาพที่ -64 โซลูชันของคุณแก้ปัญหานี้ได้
gdbj

92

คำตอบของ @ Justafinger เป็นเสน่ห์สำหรับฉันเช่นกัน

แค่อยากจะเพิ่มว่าการตั้งค่านี้ยังสามารถปรับได้อย่างง่ายดายจากตัวสร้างอินเทอร์เฟซ

  1. เลือกตัวควบคุมมุมมองของคุณ
  2. คลิกแท็บ "Attributes Inspector"
  3. ยกเลิกการเลือก 'Adjust Scroll View Insets'
  4. สนุก!

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


ใช้เวลาหลายปีในการค้นหาตัวเลือกนี้ในคุณสมบัติ UIScrollView ไม่ใช่ View Controller! ขอบคุณ!
Dominic Williams

11

ฉันพบปัญหาเดียวกันนี้ แต่ฉันพบคุณสมบัติที่ค่อนข้างแปลกบน ViewController ในตัวสร้างอินเทอร์เฟซที่ดูเหมือนจะทำให้เกิดปัญหานี้สำหรับฉัน มีชุดกล่องกาเครื่องหมาย "Extend Edges" ฉันลบเครื่องหมายถูก "Under Top Bars" และทุกอย่างเริ่มจัดวางอย่างเหมาะสมสำหรับฉัน


ใช่อันนี้เหมาะกับฉันดีกว่า "Adjust Scroll View Insets"
Dmytro

2

เมื่อตั้งค่า automaticAdjustsScrollViewInsets เป็น YES (ค่าเริ่มต้น) จะมีตำแหน่ง scrollview ไม่ตรงกันระหว่าง ios6 และ ios7 ดังนั้นเพื่อให้สอดคล้องกันคุณต้องปิดการใช้งานการตั้งค่านี้ อย่างไรก็ตาม ios6 จะขัดข้องหากพบโดยอัตโนมัติjustsScrollViewInsetsดังนั้นคุณต้องทำการเปลี่ยนแปลงทางโปรแกรมของ automaticAdjustsScrollViewInsets ตามเงื่อนไขบน ios7 หรือปิดตัวเลือกโดยใช้สตอรี่บอร์ด / NIB


2

ฉันมีปัญหาที่คล้ายกันหลังจากปิด viewController แล้ว contentOffset จาก tableView ของฉันก็เปลี่ยนเป็น (0, -64)

วิธีแก้ปัญหาของฉันค่อนข้างแปลกฉันลองคำตอบอื่น ๆ ทั้งหมด แต่ไม่ประสบความสำเร็จสิ่งเดียวที่แก้ไขปัญหาของฉันคือการเปลี่ยนตำแหน่ง tableView ในโครงสร้างควบคุมของ. xib

เป็นการควบคุมแรกในมุมมองหลักเช่นนี้:

ก่อน

ฉันย้าย tableView ทันทีหลังจาก ImageView และใช้งานได้:

หลังจาก

ดูเหมือนว่าการวางมุมมองตารางในตำแหน่งแรกทำให้เกิดปัญหาและการย้ายมุมมองตารางไปยังตำแหน่งอื่นช่วยแก้ปัญหาได้

PD ฉันไม่ได้ใช้ autoLayout ทั้งสตอรี่บอร์ด

หวังว่านี่จะช่วยใครสักคนได้!


ฉันสังเกตเห็นพฤติกรรมแปลก ๆ นี้ฉันเชื่อว่าตรรกะเบื้องหลังคือ scrollViewInsets ได้รับการปรับโดยอัตโนมัติเมื่อ scrollview เป็นลูกคนแรก มิฉะนั้นมันจะไม่สมเหตุสมผลจริงๆเพราะ scrollview ของคุณน่าจะไม่ใช่แบบเต็มหน้าจอ
สตรีม

1

ฉันก็ประสบปัญหานี้เช่นกัน

UIScrollView ขนาดเนื้อหาคำนวณโดย OS เป็นขนาดอื่น ๆ ต้นกำเนิดมาจากระบบข้อ จำกัด นั่นคือสาเหตุที่ OS มีความสงสัย

วิธีแก้ไข - คุณควรกำหนดขนาดเนื้อหาอย่างชัดเจนของUIScrollView:

  1. ฝังเนื้อหาที่เลื่อนได้ไปที่UIView(ฉันเปลี่ยนชื่อเป็นContentView)
  2. เพิ่มข้อ จำกัด :

ContentView.Weight = View.Weight และ ContentView.Height = View.Height

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


0

ดูเหมือนว่าวิธีแก้ปัญหาคือการดูไฟล์สตอรีบอร์ดเป็น "iOS 6.1 และรุ่นก่อนหน้า" (เลือกไฟล์สตอรี่บอร์ด -> ตัวตรวจสอบไฟล์ -> เอกสารตัวสร้างอินเทอร์เฟซ -> ดูเป็นการกำหนดตำแหน่งมุมมองย่อยในโหมดนี้จะแสดงการชดเชย


ฉันไม่ได้ใช้สตอรี่บอร์ด อย่างไรก็ตามฉันไม่แน่ใจว่าเป็นปัญหา ios6 ถึง ios7 ตัวอย่างข้างต้นได้รับการสร้างขึ้นอย่างสมบูรณ์ด้วย iOS 7 ยิ่งไปกว่านั้นฉันแก้ไขคำถามของฉันมันปรากฏขึ้น (เท่าที่ฉันรู้) ด้วย uiscrollview และ uitableview
สตรีม

อืมน่าสนใจ ... หากมองในแง่นี้คุณสามารถเพิ่ม variant = "6xAndEarlier" ที่ด้านบนของ XIB ในองค์ประกอบเอกสารได้เนื่องจากนี่คือความแตกต่างเมื่อพลิกบิตที่ฉันกล่าวถึงข้างต้น และ FYI ปัญหานี้เกิดขึ้นกับ uiwebview เช่นกันสำหรับฉัน
swhitman

0

ขอบคุณสำหรับการแก้ปัญหา! ฉันพยายามหลายชั่วโมงเพื่อพยายามแก้ปัญหา ทุกอย่างก็โอเคเมื่อไม่มีแถบนำทางเข้ามาเกี่ยวข้อง แต่มันก็ยุ่งเหยิงทันทีที่ฉันฝัง ViewController ใน NavigationController

ฉันจะแก้ไขได้โดยการยกเลิกการเลือกปรับเลื่อนดูขุ่นและบาร์ใต้ ทั้งสองอย่างนี้อยู่ใน Attribute Inspector ของ ViewController ขอบคุณล้าน!

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