내 JSON 파일에서 오는 긴 텍스트가 있지만 UITableViewCell에서 링크를 클릭하여 UIViewController 페이지로 이동하면 UITextView 텍스트가 문자열 콘텐츠를로드하지만 처음부터 콘텐츠를 표시하지 않고 모두 위로 스크롤해야합니다. 시간.
내가 해야하는 것?
내 JSON 파일에서 오는 긴 텍스트가 있지만 UITableViewCell에서 링크를 클릭하여 UIViewController 페이지로 이동하면 UITextView 텍스트가 문자열 콘텐츠를로드하지만 처음부터 콘텐츠를 표시하지 않고 모두 위로 스크롤해야합니다. 시간.
내가 해야하는 것?
답변:
나는 같은 문제가 있었고 그것이 효과를 내기 위해 viewDidLayoutSubviews에서 콘텐츠 오프셋을 설정해야했습니다. 이 코드를 사용하여 속성 정적 텍스트를 표시하고 있습니다.
- (void)viewDidLayoutSubviews {
[self.yourTextView setContentOffset:CGPointZero animated:NO];
}
SWIFT 3 :
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.textView.setContentOffset(CGPoint.zero, animated: false)
}
viewWillLayoutSubviews
: /
이것이 나를 위해 일한 유일한 방법입니다. UITextView 의 스크롤을 비활성화합니다.뷰가로드되기 전에 한 다음 다시 활성화합니다.
override func viewWillAppear(_ animated: Bool) {
yourTextView.isScrollEnabled = false
}
override func viewDidAppear(_ animated: Bool) {
yourTextView.isScrollEnabled = true
}
iOS 10의 UITextView 상단에있는 빈 공간 질문에 대한 답변 은 훨씬 더 깨끗한 최종 사용자 경험을 제공합니다.
에서는 viewDidLoad
텍스트 뷰를 포함하는 뷰 컨트롤러 :
self.automaticallyAdjustsScrollViewInsets = false
설정 textView.setContentOffset(CGPointMake(0,0), animated: false)
및 이러한 기타 제안 중 일부는 호출시 작동 viewDidLayoutSubviews()
하지만 iPad 2 및 이전 버전과 같은 구형 장치에서는 화면이 표시 될 때 실제로 텍스트가 스크롤되는 것을 볼 수 있습니다. 그것은 최종 사용자가보기를 원하는 것이 아닙니다.
이 솔루션을 사용한 후에도 여전히 문제가 발생했습니다. 이 문제는 투명 탐색 막대가 있고 뷰 컨트롤러에서 콘텐츠 삽입을 자동으로 조정하도록 선택하는 것과 관련이있는 것 같습니다. 내비게이션 바 아래에서 스크롤되는 텍스트에 신경 쓰지 않는다면이 설정을 끄고 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];
}
탐색 표시 줄과 상태 표시 줄의 높이를 찾고 그에 따라 콘텐츠 오프셋을 조정합니다.
이 접근 방식의 한 가지 단점은 장치가 회전 할 때 맨 위로 스크롤된다는 것입니다.
나 에게이 코드는 잘 작동합니다.
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의 첫 번째 줄에 나타납니다.
다른 답변과 유사하지만 후속 장치 회전에서 스크롤이 맨 위로 올라가지 않는다는 추가 이점이 있습니다. 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
}
스위프트 버전
다음과 같은 조합이 필요합니다.
1.) 콘센트 설정
@IBOutlet var textView: UITextView!
2.) View Controller의 스토리 보드에서 "Adjust Scroll View Insets"를 끕니다.
3.) 뷰 컨트롤러에 아래를 추가하여 콘텐츠를 제로 맨 위로 설정
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
myUITextView.setContentOffset(CGPointZero, animated: false)
}
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))
}
스위프트 3.0
override func viewWillAppear(_ animated: Bool) {
privacyText.isScrollEnabled = false
}
override func viewDidAppear(_ animated: Bool) {
privacyText.isScrollEnabled = true
}
이것은 나를 위해 가장 잘 작동했습니다! 나는 이것을 viewDidLoad () 안에 넣었다.
//TextView Scroll starts from the top
myTextView.contentOffset.y = 0
항상 나를 위해 작동하는 또 다른 방법이 있습니다. 목표 -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)
}
뷰 컨트롤러 클래스에 다음 함수를 추가하십시오.
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 里面 加上 滚动, 这样 用户 会 看到 他 往上 滚动 到 第一 行
속성이있는 텍스트가있는 신속한 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)
}
Swift 3, 4, 5 솔루션 :
문제 해결 단계 :
암호:
yourTextView.isScrollEnabled = false
let rect:CGRect = CGRect(x: 0, y: 0, width: 1, height: 1)
yourTextView.scrollRectToVisible(rect, animated: false)
yourTextView.isScrollEnabled = true
이것은 나를 위해 일했습니다. 도움이 되길 바랍니다!
이것이 내가 한 방법입니다. 나는 textview를 서브 클래 싱했다.
override func willMoveToSuperview(newSuperview: UIView?) {
self.scrollEnabled = false
}
override func layoutSubviews() {
super.layoutSubviews()
self.scrollEnabled = true
}
스토리 보드에서 텍스트보기를 배치 한보기 컨트롤러를 선택합니다. 속성 관리자에서 "Adjust Scroll View Insets"를 선택 취소합니다. 그게 다야.