UITextView 텍스트 콘텐츠가 맨 위에서 시작되지 않습니다.


79

내 JSON 파일에서 오는 긴 텍스트가 있지만 UITableViewCell에서 링크를 클릭하여 UIViewController 페이지로 이동하면 UITextView 텍스트가 문자열 콘텐츠를로드하지만 처음부터 콘텐츠를 표시하지 않고 모두 위로 스크롤해야합니다. 시간.

내가 해야하는 것?


contentOffset을 (0,0)으로 설정해 보셨습니까?
rdelmar 2014

이 질문을 편집 할 수 있습니다. 태그 아래에 '수정'이 표시됩니다. 편집하려면 클릭하십시오. 편집에 대한 제안을 받았지만 사용자가 질문을 편집해야한다고 생각합니다.
LanternMike 2014

이 페이지를 확인하고 이러한 솔루션 중 하나가 귀하에게 적합한 지 확인하십시오. 여기에있는 대부분의 모든 것이 거기에 있으며 더 많은 정보가 있습니다. stackoverflow.com/questions/1234242/… 질문이있는 경우 진행중인 작업, 작업중인 작업, 시도한 작업이 아닌 작업에 대한 구체적인 질문이 있습니다.
LanternMike 2014

여기에 내 문제와 함께 링크입니다 : 링크
Ornilo

나를 위해 일한 유일한 해결책은 출신 이 한 다른 포스트에서
안드리 바스

답변:


160

나는 같은 문제가 있었고 그것이 효과를 내기 위해 viewDidLayoutSubviews에서 콘텐츠 오프셋을 설정해야했습니다. 이 코드를 사용하여 속성 정적 텍스트를 표시하고 있습니다.

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

SWIFT 3 :

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

4
모든 답변 중에서 이것이 가장 잘 작동합니다. 또한 UITextView 텍스트가 텍스트보기의 수직 중간에서 시작하는 경우 viewDidLoad에 다음을 추가하면 문제도 해결됩니다. self.automaticallyAdjustsScrollViewInsets = false
Wizkid

흥미로운 점은 offuttjillian의 솔루션이 저에게 효과적이라는 것입니다.하지만 @Wizkid와 Glenn이 제공 한 솔루션은 iOS 9.1에서 저에게 더 나빠집니다. 어쨌든 지금 작동하고있어 저를 행복하게 만듭니다 ^^
Frozn

2
이것은 작동하는 해결책이지만 불행히도 당신이 사용하는 경우에도 못생긴 보이는 업 스크롤 큰 부작용이 있습니다 viewWillLayoutSubviews: /
Hofi

문제를 해결하기 위해 거의 6 가지 방법을 시도했지만이 답변은 iOS9.x에서만 작동했습니다.
KoreanXcodeWorker

UITextView
Hassy에

46

이것이 나를 위해 일한 유일한 방법입니다. UITextView 의 스크롤을 비활성화합니다.뷰가로드되기 전에 한 다음 다시 활성화합니다.

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

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

2
위로 스크롤의 시각적 효과를 최소화하는 최상의 솔루션
Hofi

나를 위해 일 잘
의 Thibaut 노아

해당 솔루션을 활용하여 iPad에서 스크롤 할 때 혼란스러운 문제가있었습니다.
Aliens


19

콘텐츠를로드하기 전에 프로그래밍 방식으로 textview의 스크롤 속성을 비활성화합니다. textview.scrollenabled = NO;

그리고 로딩 후 textview 스크롤을 활성화하십시오. textview.scrollenabled = YES;

뿐만 아니라 XIB항상 Textview의 스크롤링을 확인하지 마십시오.


감사합니다.하지만 collectionview 또는 tableview에이 uitextview가 있으면 작동하지 않습니다.
Amr Angry

12

iOS 10의 UITextView 상단에있는 빈 공간 질문에 대한 답변 은 훨씬 더 깨끗한 최종 사용자 경험을 제공합니다.

에서는 viewDidLoad텍스트 뷰를 포함하는 뷰 컨트롤러 :

 self.automaticallyAdjustsScrollViewInsets = false

설정 textView.setContentOffset(CGPointMake(0,0), animated: false)및 이러한 기타 제안 중 일부는 호출시 작동 viewDidLayoutSubviews()하지만 iPad 2 및 이전 버전과 같은 구형 장치에서는 화면이 표시 될 때 실제로 텍스트가 스크롤되는 것을 볼 수 있습니다. 그것은 최종 사용자가보기를 원하는 것이 아닙니다.


4

이 솔루션을 사용한 후에도 여전히 문제가 발생했습니다. 이 문제는 투명 탐색 막대가 있고 뷰 컨트롤러에서 콘텐츠 삽입을 자동으로 조정하도록 선택하는 것과 관련이있는 것 같습니다. 내비게이션 바 아래에서 스크롤되는 텍스트에 신경 쓰지 않는다면이 설정을 끄고 textview의 상단을 viewcontroller의 상단이 아닌 내비게이션 바의 하단으로 제한하는 것이 가장 좋습니다.

저처럼 아래로 스크롤 할 때 내비게이션 바 아래에 표시되기를 원했습니다. 나를 위해 일한 해결책은 이것을 추가하는 것이 었습니다.

- (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];
}

탐색 표시 줄과 상태 표시 줄의 높이를 찾고 그에 따라 콘텐츠 오프셋을 조정합니다.

이 접근 방식의 한 가지 단점은 장치가 회전 할 때 맨 위로 스크롤된다는 것입니다.


감사합니다-이것은 궁극적으로 저를 올바른 아이디어로 이끌었습니다. :)
HannahCarney 2015

4

나 에게이 코드는 잘 작동합니다.

    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

정확한 위치로 스크롤하여 화면 상단에 표시하려면 다음 코드를 사용합니다.

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

contentOffset.y를 설정하면 텍스트 끝으로 스크롤 한 다음 scrollRangeToVisible은 scrollToLocation 값까지 스크롤합니다. 따라서 필요한 위치가 scrollView의 첫 번째 줄에 나타납니다.


4

다른 답변과 유사하지만 후속 장치 회전에서 스크롤이 맨 위로 올라가지 않는다는 추가 이점이 있습니다. 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
}

몇 가지 다른 답변을 시도한 후 이것이 가장 잘 작동했습니다. Swindler의 답변에 따라 CGPoint에 CGPointZero를 사용할 수 있습니다.
Mitch Downey

이 메서드 (viewDidLayoutSubviews)에서이를 수행하는 것이 중요합니다. 많은 답변이 viewWillAppear에서 이것을 수행하도록 할 것이지만 이것은 잘못된 것입니다. viewDidLayoutSubviews는이를 수행하는 장소입니다. 감사.
geekyaleks

3

스위프트 버전

다음과 같은 조합이 필요합니다.

1.) 콘센트 설정

  @IBOutlet var textView: UITextView!

2.) View Controller의 스토리 보드에서 "Adjust Scroll View Insets"를 끕니다.

3.) 뷰 컨트롤러에 아래를 추가하여 콘텐츠를 제로 맨 위로 설정

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

Swift에서 'CGPointZero'를 사용할 수 없습니다
ali

3

대신 오프셋 콘텐츠를 설정하는 viewDidLayoutSubviews을 당신은 작성할 수 있습니다 layoutIfNeeded 에서 viewDidLoad에 다음과 같이 텍스트 뷰의 적절한 위치를 설정합니다 :

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

건배 !!


2

Swift 2, Xcode 7 솔루션에서 스크롤을 활성화 하고 텍스트가 맨 위에서 시작되도록하려면 다음이 필요합니다.

@IBOutlet weak var myUITextView: UITextView!

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

1
감사! 이것은 Swift 2.2에서 완벽하게 작동했습니다. 여기에있는 다른 솔루션 중 어느 것도 부드럽고 간단하게 작동하지 않았습니다.
Natalia

2

스위프트 3.0

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

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

스토리 보드에서 스크롤을 비활성화하십시오! 그리고 코드에서 활성화하십시오. 재정의 func viewDidAppear (_ animated : Bool) {privacyText.isScrollEnabled = true}
Vitaliy A

2

이것은 나를 위해 가장 잘 작동했습니다! 나는 이것을 viewDidLoad () 안에 넣었다.

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

1
식을 할당 할 수 없습니다.
Bhumesh Purohit

1

항상 나를 위해 작동하는 또 다른 방법이 있습니다. 목표 -C :

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

그리고 Swift에서 :

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

1

Swift 버전 :

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

1

뷰 컨트롤러 클래스에 다음 함수를 추가하십시오.

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 里面 加上 滚动, 这样 用户 会 看到 他 往上 滚动 到 第一 行


마지막 문장을 영어로 번역 해 주 시겠어요?
Gilles Gouaillardet

1

속성이있는 텍스트가있는 신속한 4에서 어떤 답변도 도움이되지 않으며 주제에 대한 답변을 결합합니다.

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)
}

uittextview가 collection view 또는 tableview에 있다면 어떨까요
Amr Angry

난 아무 생각이 @AmrAngry, 난 그냥 텍스트보기 위해 그것을 사용
hall.keskin

덕분에 내가 tetxview.scrollRangeToVisible ((0, 0) NSMakeRange)를 사용
아 므르 화가

1

Swift 3, 4, 5 솔루션 :

문제 해결 단계 :

  • UITextView 스크롤 비활성화
  • scrollRectToVisible 설정
  • UITextView 스크롤 활성화

암호:

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

이것은 나를 위해 일했습니다. 도움이 되길 바랍니다!


편리하고 쉬운 설명을 해주신 Mohit에게 감사드립니다.
Praveen Kumar Verma

0

이것이 내가 한 방법입니다. 나는 textview를 서브 클래 싱했다.

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

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

0

스토리 보드에서 텍스트보기를 배치 한보기 컨트롤러를 선택합니다. 속성 관리자에서 "Adjust Scroll View Insets"를 선택 취소합니다. 그게 다야.


0

이 코드를 수업에 넣으십시오.

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

-2

viewdidload에 코드 추가

self.automaticallyAdjustsScrollViewInsets = NO;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.