UITextView文本内容不是从顶部开始的

时间:2014-11-10 02:42:48

标签: objective-c xcode text uitextview

我有一个很长的文本来自我的JSON文件但是当我点击我的UITableViewCell的链接转到我的UIViewController页面时,UITextView文本加载了字符串内容,但是它不会从头开始显示内容而我必须向上滚动。

我需要做什么?

22 个答案:

答案 0 :(得分:146)

我遇到了同样的问题,事实证明我必须在viewDidLayoutSubviews中设置内容偏移才能使其生效。我使用此代码显示属性静态文本。

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

SWIFT 3:

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

答案 1 :(得分:38)

这是对我有用的唯一方法。在加载视图之前禁用 UITextView 的滚动,然后我再次启用它:

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

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

答案 2 :(得分:27)

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

中的

答案 3 :(得分:18)

在加载内容之前以编程方式禁用textview的滚动属性        textview.scrollenabled = NO;

加载后启用textview textview.scrollenabled = YES;

的滚动

同样检查XIB,始终不检查启用Textview的滚动。

答案 4 :(得分:12)

问题Blank space at top of UITextView in iOS 10的答案提供了更清晰的最终用户体验。

在包含文本视图的视图控制器的viewDidLoad中:

 self.automaticallyAdjustsScrollViewInsets = false

设置textView.setContentOffset(CGPointMake(0,0), animated: false)以及其他一些建议在viewDidLayoutSubviews()中调用时可以正常工作,但在iPad 2及更早版本等旧设备上,实际上会在显示屏幕时看到文本滚动。这不是您希望最终用户看到的内容。

答案 5 :(得分:4)

使用这些解决方案后我仍然遇到问题。问题肯定似乎与透明导航栏和选择自动调整视图控制器上的内容插入有关。如果您不关心在导航栏下方滚动的文本,则最好关闭这些设置并将文本视图的顶部约束到导航栏的底部,而不是视图控制器的顶部。

如果像我一样,当您向下滚动时,您希望它显示在导航栏下方;然后,对我有用的解决方案就是添加它。

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

这只是查找导航栏和状态栏的高度,并相应地调整内容偏移量。

请注意,此方法的一个缺点是,当设备旋转时,您最终会滚动回到顶部。

答案 6 :(得分: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的第一行。

答案 7 :(得分: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
}

答案 8 :(得分:3)

Swift版本

需要一系列的事情:

1。)设置你的插座

  @IBOutlet var textView: UITextView!

2。)在View Controller的故事板中,关闭&#34;调整滚动视图插图&#34;

3。)通过在视图控制器中添加以下内容将内容设置为零[/ p>

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

答案 9 :(得分: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))
}

答案 10 :(得分:2)

Swift 3.0

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

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

答案 11 :(得分:1)

这是另一种方法,它始终适合我。目标C:

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

在斯威夫特:

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

答案 12 :(得分:1)

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

答案 13 :(得分: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里面加上滚动,这样用户会看到他往上滚动到第一行

答案 14 :(得分:1)

这对我来说是最好的!我把它放在viewDidLoad()中。

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

答案 15 :(得分:1)

要解决的步骤

  • 禁用UITextView滚动视图
  • 设置scrollRectToVisible启用
  • UITextView滚动

斯威夫特3:

<rule ref="Squiz.WhiteSpace.OperatorSpacing">
    <properties>
        <property name="ignoreNewlines" value="true"/>
    </properties>
</rule>

这适合我。

答案 16 :(得分:1)

Swift版本:

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

答案 17 :(得分:0)

从故事板中,选择放置文本视图的视图控制器。在属性检查器中,取消选中“调整滚动视图插图”。就是这样。

答案 18 :(得分:0)

This is how i did it. I subclassed textview, and:

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

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

答案 19 :(得分:0)

您可以从 viewDidLoad 编写 layoutIfNeeded ,而不是从 viewDidLoout 设置内容偏移,以设置textview的正确位置,如下所示:

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

干杯!!

答案 20 :(得分:0)

将此代码放在您的课​​程

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

答案 21 :(得分:-2)

将代码添加到viewdidload

self.automaticallyAdjustsScrollViewInsets = NO;