我有一个来自JSON文件的长文本,但是当我单击UITableViewCell中的链接转到我的UIViewController页面时,UITextView文本会加载字符串内容,但不会从头开始显示内容,因此我必须向上滚动所有内容时间。
我需要做什么?
我有一个来自JSON文件的长文本,但是当我单击UITableViewCell中的链接转到我的UIViewController页面时,UITextView文本会加载字符串内容,但不会从头开始显示内容,因此我必须向上滚动所有内容时间。
我需要做什么?
Answers:
我遇到了同样的问题,结果我不得不在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
}
通过以编程方式在加载内容之前禁用textview的滚动属性
textview.scrollenabled = NO;
并在加载后启用textview滚动 textview.scrollenabled = YES;
还要检查XIB
,始终不选中Textview的滚动启用。
问题的答案iOS 10中UITextView顶部的空白提供了更加干净的最终用户体验。
在viewDidLoad
包含文本视图的视图控制器中:
self.automaticallyAdjustsScrollViewInsets = false
设置textView.setContentOffset(CGPointMake(0,0), animated: false)
和其中的一些其他建议在被调用时都起作用,viewDidLayoutSubviews()
但是在较旧的设备(如iPad 2和更旧的设备)上,显示屏幕时实际上会看到文本滚动。那不是您希望最终用户看到的东西。
使用这些解决方案后,我仍然遇到问题。这个问题似乎与透明的导航栏和选择自动调整视图控制器上的内容插图有关。如果您不关心文本在导航栏下方的滚动,则最好保留这些设置,并将文本视图的顶部限制在导航栏的底部,而不是视图控制器的顶部。
如果像我一样,您希望它在向下滚动时显示在导航栏的下面;那么对我有用的解决方案是添加它。
- (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
}
在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))
}
这对我来说效果最好!我把它放在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里面加上滚动,这样用户会看到他往上滚动到第一行
在带有属性文本的swift 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
}
在情节提要中,选择要放置文本视图的视图控制器。在属性检查器中,取消选中“调整滚动视图插图”。而已。