พื้นที่ว่างที่ด้านบนของ UITextView ใน iOS 10


116

ฉันมี UITextView พร้อมข้อความบางส่วนอยู่ ทุกอย่างเป็นไปด้วยดีกับ iOS 6 แต่ตอนนี้ใช้ iOS 7 แล้วมันจะปล่อยพื้นที่ว่างไว้ด้านบนแล้ววางข้อความไว้ด้านล่างตรงกลางของ textviewใส่คำอธิบายภาพที่นี่

ฉันไม่ได้ตั้งค่า contentOffSet ใด ๆ กรุณาช่วย!

คำตอบ:


217

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

เพื่อป้องกันสิ่งนี้ตั้งค่าคุณสมบัติต่อไปนี้บนตัวควบคุมมุมมองที่มีมุมมองข้อความ:

self.automaticallyAdjustsScrollViewInsets = NO

7
นี่เป็นคำตอบที่ดีกว่าเพราะไม่เพียง แต่ระบุถึงวิธีการแก้ไขปัญหา แต่เหตุใดจึงเกิดขึ้นตั้งแต่แรก
Stephen Melvin

1
BTW คุณไม่จำเป็นต้องซับคลาสและลบล้าง เพียงตั้งค่า AutomaticAdjustsScrollViewInsets เป็น NO หลังจากที่คุณสร้างอินสแตนซ์ UITextView
leftspin

1
@leftspin เป็นกรณีที่หายากมากที่คุณไม่ได้ subclassed ตัวควบคุมมุมมอง และการลบล้างวิธีนี้หมายความว่าโค้ดของคุณจะยังใช้งานได้กับ iOS เวอร์ชันที่ต่ำกว่า - การตั้งค่าคุณสมบัติหมายความว่าคุณต้องตรวจสอบความเข้ากันได้ก่อน
jrturton

1
ดังนั้นหาก Model View Controller ของฉันอยู่นอก UINavigationController ออฟเซ็ตจะถูกล้าง? มันบ้ามาก ... พฤติกรรมนี้จะถูกต้องก็ต่อเมื่อมุมมองข้อความของฉันอยู่ด้านบนเท่านั้นมิฉะนั้นจะเป็นขยะ ... มีใครอธิบายได้ไหมว่าทำไม Apple ถึงทำอะไรแบบนั้น
Paul Brewczynski

@jrturton ขออภัยที่นี่เป็นโพสต์ที่เก่ากว่าและโปรดขอโทษด้วยเพราะฉันยังใหม่กับ objective-c แต่ตอนนี้เป็นคุณสมบัติของ UIViewController ... มันเคยเป็นวิธีการหรือไม่?
Craig

58

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

คำตอบของ jrturton ไม่ใช่วิธีที่สะอาดที่สุดในการแก้ปัญหา คุณไม่จำเป็นต้องลบล้าง ง่าย ๆ เข้าไว้!

สิ่งที่คุณต้องมีคือตั้งค่าสิ่งต่อไปนี้:

self.automaticallyAdjustsScrollViewInsets = NO;

ในเมธอด viewDidLoad

ตรวจสอบเอกสาร: https://developer.apple.com/documentation/uikit/uiviewcontroller/1621372-automaticallyadjustsscrollviewin


1
การเปลี่ยนแปลงในสตอรีบอร์ดบางครั้งอาจจะดีกว่า ไปที่ "Identity Inspector" -> "User Defined Runtime Attributes" และเพิ่มคำจำกัดความที่นั่น
hufeng03

automaticallyAdjustsScrollViewInsets เลิกใช้แล้ว จาก iOS11 ให้ใช้contentInsetAdjustmentBehavior
Cœur

47

ในตัวสร้างอินเทอร์เฟซ

  • เลือกตัวควบคุมมุมมองที่มี UITextView
  • ไปที่ตัวตรวจสอบแอตทริบิวต์
  • ยกเลิกการเลือก "Adjust Scroll View Insets"

นี่เป็นวิธีที่ง่ายที่สุดสำหรับกรณีของฉันใน ios8
platinor

3
หมายเหตุ: เป็นคุณสมบัติของ UIViewController หาไม่เจอแล้วรู้ตัวว่าอ่านข้อความไม่ครบ
Maik639


24

ไปที่Interface Builder:

  1. เลือกview controllerที่มีไฟล์text view
  2. ยกเลิกการเลือกAdjusts Scroll View Insetsคุณสมบัติ

ใส่คำอธิบายภาพที่นี่


นี่คือสิ่งที่ฉันกำลังมองหา นอกจากนี้คุณสามารถทำได้โดยเพิ่ม 'self.automaticallyAdjustsScrollViewInsets = false' ไปที่ viewController
CodeOverRide

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

10

ฉันสงสัยจริงๆว่านี่เป็นคุณสมบัติจริงUIScrollViewหรือUITextViewเปล่า…สิ่งที่ใส่เข้าไปอัตโนมัติ 64 จุดนี้จะถูกเพิ่มก็ต่อเมื่อหรือเป็นความลึกที่มากขึ้นของมุมมองย่อยทั้งหมดของมุมมองของตัวควบคุมมุมมอง ตัวอย่างเช่นหากคุณเพิ่มมุมมองด้านหลัง (ในที่นี้ฉันกำลังพูดถึง z-buffer ไม่ใช่มุมมองการมองเห็น) มุมมองแบบเลื่อนจะไม่เพิ่มสิ่งที่ใส่เข้าไป 64 จุดโดยอัตโนมัติ

ตัวอย่างเช่นอันนี้เพิ่มสิ่งที่ใส่เข้าไป:

ใส่คำอธิบายภาพที่นี่

ในกรณีนี้จะไม่มีการเพิ่มสิ่งที่ใส่เข้าไป:

ใส่คำอธิบายภาพที่นี่

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



6

คุณสามารถลบพื้นที่ว่างด้านบนของคุณได้UITextViewโดยเพิ่ม:

yourTextView.textContainerInset = UIEdgeInsetsZero;

5

ฉันแก้ไขปัญหานี้โดยตั้งค่าชดเชยเนื้อหาเป็นค่าลบ นี่คือรหัส Swift

yourTextView.setContentOffset(CGPoint(x: 0, y: -150), animated: true)

นี่เป็นทางออกที่ดีที่สุดในการเก็บสิ่งที่ใส่เข้าไปและเลื่อนใต้แถบโปร่งแสงอย่างถูกต้อง ฉันขอแนะนำการปรับเปลี่ยนนี้ [self.textView setContentOffset:CGPointMake(0.f, -self.topLayoutGuide.length) animated:NO];
InitJason

1
ไม่มีอะไรได้ผลสำหรับฉันยกเว้นสิ่งนี้ Swift, Xcode 9.1.2
Ashok

1

สิ่งที่คุณต้องเข้าใจคือสิ่งนี้เกี่ยวข้องกับแถบนำทาง:

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

1

ฉันลองใช้เคล็ดลับต่อไปนี้ได้ผล

- (void)viewDidLoad{
   self.textView.scrollEnabled = NO;  
}       
- (void)viewDidAppear:(BOOL)animated {
   [super viewDidAppear:animated];
   self.textView.scrollEnabled = YES;
}


0

นี่เป็นวิธีแก้ปัญหาที่ไม่เป็นมืออาชีพฉันแน่ใจ ... แต่การใส่ป้ายกำกับเปล่าไว้ด้านหลัง textview ก็ช่วยแก้ปัญหาได้


1
นี่ไม่ใช่วิธีแก้ปัญหา =)
Ilker Baltaci

0

สิ่งนี้ใช้ได้ผลสำหรับฉัน (พร้อมใช้งานจาก iOS 7)

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