Nội dung văn bản UITextView không bắt đầu từ đầu


79

Tôi có một văn bản dài đến từ tệp JSON của mình nhưng khi tôi nhấp vào liên kết từ UITableViewCell để chuyển đến trang UIViewController của mình, văn bản UITextView tải nội dung chuỗi nhưng nó không hiển thị nội dung từ đầu và tôi phải cuộn lên tất cả thời gian.

Tôi cần phải làm gì?


Bạn đã thử đặt contentOffset thành (0,0) chưa?
rdelmar

Bạn có thể chỉnh sửa câu hỏi này. Bên dưới các thẻ bạn thấy 'chỉnh sửa'. nhấp vào đó để chỉnh sửa. Tôi nhận được đề xuất chỉnh sửa nhưng cảm thấy người dùng nên chỉnh sửa câu hỏi.
LanternMike

hãy xem trang này và xem một trong những giải pháp này có phù hợp với bạn không. Hầu hết mọi thứ ở đây đều ở đó và nhiều hơn nữa stackoverflow.com/questions/1234242/… Nếu bạn có câu hỏi, hãy cụ thể những gì đang diễn ra, hoạt động, không hiệu quả những gì bạn đã thử.
LanternMike

Đây là liên kết với vấn đề của tôi: liên kết
Ornilo

giải pháp duy nhất làm việc cho tôi là từ này từ bài khác
Andriy Bas

Câu trả lời:


160

Tôi đã gặp vấn đề tương tự và hóa ra tôi phải đặt độ lệch nội dung trong viewDidLayoutSubviews để nó có hiệu lực. Tôi đang sử dụng mã này để hiển thị văn bản tĩnh được gán.

- (void)viewDidLayoutSubviews {
    [self.yourTextView setContentOffset:CGPointZero animated:NO];
}

SWIFT 3:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.textView.setContentOffset(CGPoint.zero, animated: false)
}

4
Trong tất cả các câu trả lời, câu trả lời này hoạt động tốt nhất. Ngoài ra, nếu văn bản UITextView của bạn bắt đầu ở đâu đó về phía giữa theo chiều dọc của chế độ xem văn bản thì việc thêm phần sau vào viewDidLoad cũng sẽ khắc phục được điều đó: self.automaticallyAdjustsScrollViewInsets = false
Wizkid

Điều thú vị là, giải pháp của offuttjillian rằng đã làm việc cho tôi, nhưng giải pháp được đưa ra bởi bạn @Wizkid và Glenn làm cho nó thậm chí còn tồi tệ hơn đối với tôi trên iOS 9.1 Dù sao nó làm việc bây giờ và làm cho tôi hạnh phúc ^^
Frozn

2
mặc dù đây là một giải pháp làm việc không may nó có một tác dụng phụ lớn các upscroll nhìn thấy xấu xí ngay cả khi bạn đang sử dụng viewWillLayoutSubviews: /
Hofi

Thử gần 6 cách để giải quyết vấn đề, câu trả lời này chỉ phù hợp với tôi trong iOS9.x.
KoreanXcodeWorker

hoạt động tốt ngay cả khi thiết lập nó sau khi giao văn bản cho UITextView
Hassy

46

Đây là cách duy nhất làm việc cho tôi. Tôi vô hiệu hóa cuộn của UITextView trước khi chế độ xem được tải và sau đó tôi bật lại:

  override func viewWillAppear(_ animated: Bool) {
        yourTextView.isScrollEnabled = false
    }

    override func viewDidAppear(_ animated: Bool) {
        yourTextView.isScrollEnabled = true
    }

2
giải pháp tốt nhất để có hiệu ứng hình ảnh có thể nhìn thấy tối thiểu của xảy ra lên cuộn
Hofi

Làm việc tốt cho tôi
thibaut noah

Tôi đã gặp một số vấn đề lộn xộn khi cuộn trên iPad bằng cách sử dụng giải pháp đó.
Người ngoài hành tinh

27
[self.textView scrollRangeToVisible:NSMakeRange(0, 1)];

trong viewDidLoad


19

Bằng cách lập trình trước khi tải nội dung, hãy tắt thuộc tính cuộn của textview textview.scrollenabled = NO;

Và sau khi tải, hãy cho phép cuộn textview textview.scrollenabled = YES;

Cũng như kiểm tra XIB, luôn luôn không kiểm tra cuộn được bật của Textview.


cảm ơn rất nhiều nhưng nếu chúng ta có uitextview này trong collectionview hoặc tableview nó sẽ không làm việc
Amr Angry

12

Câu trả lời cho câu hỏi Khoảng trống ở đầu UITextView trong iOS 10 cung cấp trải nghiệm người dùng cuối sạch hơn nhiều.

Trong viewDidLoadbộ điều khiển chế độ xem có chứa chế độ xem văn bản:

 self.automaticallyAdjustsScrollViewInsets = false

Cài đặt textView.setContentOffset(CGPointMake(0,0), animated: false)và một số đề xuất khác hoạt động khi được gọi trong viewDidLayoutSubviews()nhưng trên các thiết bị cũ hơn như iPad 2 trở lên, bạn sẽ thực sự thấy văn bản được cuộn khi màn hình hiển thị. Đó không phải là thứ bạn muốn người dùng cuối nhìn thấy.


4

Tôi vẫn gặp sự cố sau khi sử dụng các giải pháp này. Vấn đề chắc chắn có vẻ liên quan đến việc có các thanh điều hướng trong suốt và lựa chọn để tự động điều chỉnh nội dung trong bộ điều khiển chế độ xem. Nếu bạn không quan tâm đến việc cuộn văn bản của mình bên dưới thanh điều hướng thì tốt nhất bạn nên tắt các cài đặt này và hạn chế phần trên cùng của chế độ xem văn bản của bạn ở cuối thanh điều hướng, thay vì ở đầu của bộ điều khiển chế độ xem.

Nếu giống như tôi, bạn muốn nó xuất hiện bên dưới thanh điều hướng khi bạn cuộn xuống; sau đó giải pháp làm việc cho tôi là thêm điều này.

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    CGFloat offset = self.navigationController.navigationBar.frame.size.height+[UIApplication sharedApplication].statusBarFrame.size.height;

    [self.textView setContentOffset:CGPointMake(0, -offset) animated:NO];
}

Thao tác này chỉ tìm chiều cao của thanh điều hướng và thanh trạng thái và điều chỉnh độ lệch nội dung cho phù hợp.

Lưu ý rằng một nhược điểm của phương pháp này là khi thiết bị xoay, bạn sẽ phải cuộn trở lại đầu.


Cảm ơn bạn - điều này cuối cùng dẫn tôi đến ý tưởng đúng :)
HannahCarney

4

Đối với tôi, mã này hoạt động tốt:

    textView.attributedText = newText //or textView.text = ...

    //this part of code scrolls to top
    textView.contentOffset.y = -64 //or = 0 if no Navigation Bar
    textView.scrollEnabled = false
    textView.layoutIfNeeded()
    textView.scrollEnabled = true

Để cuộn đến vị trí chính xác và hiển thị nó trên đầu màn hình, tôi sử dụng mã này:

    var scrollToLocation = 50 //<needed position>
    textView.contentOffset.y = textView.contentSize.height
    textView.scrollRangeToVisible(NSRange.init(location: scrollToLocation, length: 1))

Đặt contentOffset.y cuộn đến cuối văn bản, sau đó scrollRangeToVosystem sẽ cuộn đến giá trị của scrollToLocation. Do đó, vị trí cần thiết xuất hiện trong dòng đầu tiên của scrollView.


4

Tương tự như một số câu trả lời khác, nhưng với lợi ích bổ sung là bạn sẽ không làm cuộn lên trên khi xoay thiết bị tiếp theo. Hoạt động tốt trong Swift 2.2

/// Whether view has laid out subviews at least once before.
var viewDidLayoutSubviewsAtLeastOnce = false

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    if !viewDidLayoutSubviewsAtLeastOnce {
        textView.setContentOffset(CGPoint(x: 0, y: -textView.contentInset.top), animated: false)
    }

    viewDidLayoutSubviewsAtLeastOnce = true
}

Sau khi thử một vài câu trả lời khác nhau, câu trả lời này phù hợp nhất với tôi. Theo câu trả lời của Swindler, bạn có thể sử dụng CGPointZero cho CGPoint.
Mitch Downey

Điều quan trọng là phải thực hiện điều này trong phương pháp này - viewDidLayoutSubviews. Nhiều câu trả lời sẽ yêu cầu bạn làm điều này trong viewWillAppear, nhưng điều này là sai. viewDidLayoutSubviews là nơi để làm điều này. Cảm ơn.
geekyaleks

3

Phiên bản Swift

Cần có sự kết hợp của nhiều thứ:

1.) Đặt ổ cắm của bạn

  @IBOutlet var textView: UITextView!

2.) Trong bảng phân cảnh trên View Controller, hãy tắt "Adjust Scroll View Insets"

3.) Đặt nội dung về 0 trên cùng bằng cách thêm bên dưới vào bộ điều khiển chế độ xem của bạn

override func viewWillLayoutSubviews() {
   super.viewWillLayoutSubviews()
     myUITextView.setContentOffset(CGPointZero, animated: false)
}

'CGPointZero' không khả dụng trong Swift
ali

3

Thay vì đặt độ lệch nội dung từ viewDidLayoutSubviews, bạn có thể viết layoutIfNeeded từ viewDidLoad để đặt vị trí thích hợp của textview như bên dưới:

    self.textView.layoutIfNeeded()
    self.textView.setContentOffset(CGPoint.zero, animated: false)

Chúc mừng !!


2

Trong giải pháp Swift 2, Xcode 7, để cuộn Enabled cũng như có văn bản bắt đầu ở trên cùng, đây là tất cả những gì bạn cần:

@IBOutlet weak var myUITextView: UITextView!

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    //start scroll at top of text
    myUITextView.scrollRangeToVisible(NSMakeRange(0, 0))
}

1
cảm ơn! điều này hoàn toàn phù hợp với tôi với Swift 2.2. Không có giải pháp nào khác ở đây hoạt động trơn tru và đơn giản.
Natalia

2

Swift 3.0

override func viewWillAppear(_ animated: Bool) {
    privacyText.isScrollEnabled = false
}

override func viewDidAppear(_ animated: Bool) {
    privacyText.isScrollEnabled = true
}

Tắt tính năng cuộn trong Bảng phân cảnh! Và kích hoạt trong mã. ghi đè func viewDidAppear (_ animation: Bool) {privacyText.isScrollEnabled = true}
Vitaliy A

2

Điều này làm việc tốt nhất cho tôi! Tôi đã đặt nó trong viewDidLoad ().

//TextView Scroll starts from the top
myTextView.contentOffset.y = 0

1
Biểu thức là không thể chỉ định.
Bhumesh Purohit

1

Đây là một cách khác để làm điều đó luôn hiệu quả với tôi. Mục tiêu-C:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self.textView setContentOffset:CGPointZero animated:NO];
}

Và trong Swift:

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    textView.setContentOffset(CGPointZero, animated: false)
}

1

Phiên bản Swift:

override func viewDidLayoutSubviews() {
    yourTextView.setContentOffset(CGPointZero, animated: false)
}

1

thêm chức năng sau vào lớp bộ điều khiển chế độ xem của bạn ...

Swift 3

override func viewDidLayoutSubviews() {
    self.mainTextView.setContentOffset(.zero, animated: false)
}
Swift 2.1

override func viewDidLayoutSubviews() {
    self.mainTextView.setContentOffset(CGPointZero, animated: false)
}
Objective C

- (void)viewDidLayoutSubviews {
    [self.mainTextView setContentOffset:CGPointZero animated:NO];
}

或者 你 在 ViewDidAppear 里面 加上 滚动 , 这样 用户 会 看到 他 往上 滚动 到 第一 行


bạn có thể vui lòng dịch câu cuối cùng sang tiếng Anh không?
Gilles Gouaillardet

1

trong nhanh 4 với văn bản được quy cho bất kỳ câu trả lời nào không giúp tôi và tôi kết hợp một số câu trả lời trong chủ đề.

override func viewWillAppear(_ animated: Bool) {
     super.viewWillAppear(animated)
     uiTextview.isScrollEnabled = false
}

override func viewDidAppear(_ animated: Bool) {
     uiTextview.isScrollEnabled = true
     uiTextview.setContentOffset(CGPoint.zero, animated: false)
}

những gì về nếu uittextview là theo quan điểm của bộ sưu tập hoặc tableview
Amr Angry

@AmrAngry tôi không có ý tưởng, tôi chỉ sử dụng nó cho xem văn bản
hall.keskin

cảm ơn tôi sử dụng tetxview.scrollRangeToVible (NSMakeRange (0, 0))
Amr Angry

1

Giải pháp Swift 3, 4, 5:

Các bước để giải quyết vấn đề:

  • Tắt cuộn UITextView
  • đặt scrollRectToVible
  • cho phép cuộn UITextView

Mã:

yourTextView.isScrollEnabled = false
let rect:CGRect = CGRect(x: 0, y: 0, width: 1, height: 1)
yourTextView.scrollRectToVisible(rect, animated: false)
yourTextView.isScrollEnabled = true

Điều này làm việc cho tôi. Hy vọng rằng sẽ hữu ích!


Cảm ơn Mohit vì một lời giải thích dễ hiểu.
Praveen Kumar Verma

0

Đây là cách tôi đã làm nó. Tôi đã xếp lớp phụ cho textview và:

override func willMoveToSuperview(newSuperview: UIView?) {
    self.scrollEnabled = false
}

override func layoutSubviews() {
    super.layoutSubviews()
    self.scrollEnabled = true
}

0

Từ bảng phân cảnh, chọn bộ điều khiển chế độ xem mà bạn đã đặt chế độ xem văn bản. Trong trình kiểm tra thuộc tính, bỏ chọn "Điều chỉnh trang nội bộ dạng xem cuộn". Đó là nó.


0

Đặt mã này vào lớp học của bạn

override func viewDidLayoutSubviews() {
        self.About_TV.setContentOffset(.zero, animated: false) // About_TV : your text view name)
    }

-2

Thêm mã vào viewdidload

self.automaticallyAdjustsScrollViewInsets = NO;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.