UITextView从文本的底部或中间开始

时间:2014-12-23 14:33:37

标签: ios objective-c swift xcode cocoa-touch

我会对它做出正确的决定。我在视图中放置了UItextView,当需要滚动查看所有文本时(当textView中存在大量文本时)textView有时会在文本的中间和文本的底部开始其他时间。

enter image description here

textView上未启用编辑。我需要一种方法来强制textView每次都从顶部开始。我看到一些问题,其他人使用内容偏移,但我真的不知道它是如何工作的,或者它是否适用于此处。

感谢您的帮助。

19 个答案:

答案 0 :(得分:163)

这对我有用!

目标C:

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

夫特:

self.textView.scrollRangeToVisible(NSMakeRange(0, 0))

Swift 2(替代解决方案)

将此覆盖方法添加到ViewController

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

Swift 3& 4(语法编辑)

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

答案 1 :(得分:51)

上面的所有答案对我都不起作用。但是,秘密最终是在viewDidLayoutSubviews的覆盖范围内实现您的解决方案,如:

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

HTH:)

答案 2 :(得分:14)

在Swift 2中

您可以使用它来使textView从顶部开始:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    myTextView.setContentOffset(CGPointZero, animated: false)
}

确认使用Swift 2在Xcode 7.2中工作

答案 3 :(得分:13)

请尝试以下代码 -

if ( [self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]){
     self.automaticallyAdjustsScrollViewInsets = NO;         
}

或者您也可以通过StoryBoard设置此属性 -

选择ViewController,然后选择属性检查器,现在取消选中Adjust Scroll View Insets

答案 4 :(得分:7)

对于Swift> 2.2,我使用上述方法遇到了iOS 8和iOS 9的问题,因为没有单一的答案可行,所以这就是我为使它们工作所做的一切。

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    if #available(iOS 9.0, *) {
        textView.scrollEnabled = false
    }

    self.textView.scrollRangeToVisible(NSMakeRange(0, 0))
}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)

    if #available(iOS 9.0, *) {
        textView.scrollEnabled = true
    }
}

答案 5 :(得分:6)

将您的UINavigationBar的translucent媒体资源更新为NO

self.navigationController.navigationBar.translucent = NO;

这将修复视图在导航栏和状态栏下面的框架。

如果您必须显示和隐藏导航栏,请使用viewDidLoad

中的以下代码
 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific

希望这有帮助。

答案 6 :(得分:5)

通过大量测试,我发现必须在viewWillLayoutSubviews()函数中添加以下内容,以确保UITextView从一开始就显示出来:

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()            
    textViewTerms.scrollRangeToVisible(NSMakeRange(0, 0))
}

答案 7 :(得分:4)

Xcode 7.2 7c68; IOS 9.1

我的ViewController包含UITextView很复杂,并且在项目期间发生了很大的变化(IDE版本也可能会改变2~3次)。

我已经尝试了以上所有解决方案,如果您遇到同样的问题,请 PATIENT

有三种可能的密码'解决:

  1. textView.scrollEnabled = false //then set text textView.scrollEnabled = true
  2. textView.scrollRangeToVisible(NSMakeRange(0, 0))
  3. textView.setContentOffset(CGPointZero, animated: false)
  4. 您可以将这些代码放在两个位置:

    1. viewDidLoad()
    2. viewDidLayoutSubviews()
    3. 结合它们,你得到3 * 2 = 6个解决方案,正确的组合取决于你ViewController的复杂程度(相信我,在删除textView以上的视图后,我需要找到一个新的组合)。

      我发现:

      当提出密码'在viewDidLayoutSubviews(),但在textView.text = someStrings viewDidLoad()textView中的内容将会震动'有时。所以,把它们放在同一个地方。

      最后一句话:尝试所有组合,这就是我在两个月内解决这个愚蠢错误超过三次的方法。

答案 8 :(得分:4)

将这一行代码放在 ViewDidLoad

self.automaticallyAdjustsScrollViewInsets = false

答案 9 :(得分:4)

To operate correctly, EPIC requires a Perl interpreter" reason: Fail to execute command line "C:\Perl\bin\perl.exe 滚动似乎对很多人来说都是一个问题。从这里的答案(特别是this)和Apple Developer文档中收集,使用我自己的智慧,这里有一个适合我的解决方案。您可以修改代码以满足您的需求。

我的用例如下:相同的UITextView用于不同的目的,在不同的情况下显示不同的内容。我想要的是,当内容改变时,旧的滚动位置被恢复,或者有时滚动到最后。完成后我不想要太多动画。特别是我不希望视图像所有文本都是新的一样动画。该解决方案首先在没有动画的情况下恢复旧的滚动位置,然后滚动到最终动画,如果需要的话。

你需要做什么(或者我应该说可以做)是如下扩展UITextView:

UITextView

它的作用是更新文本,然后使用extension UITextView { func setText(text: String, storedOffset: CGPoint, scrollToEnd: Bool) { self.text = text let delayInSeconds = 0.001 let popTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(delayInSeconds * Double(NSEC_PER_SEC))) dispatch_after(popTime, dispatch_get_main_queue(), { self.setContentOffset(storedOffset, animated: false) if scrollToEnd && !text.isEmpty { let popTime: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(delayInSeconds * Double(NSEC_PER_SEC))) dispatch_after(popTime, dispatch_get_main_queue(), { self.scrollRangeToVisible(NSMakeRange(text.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) - 1, 0)) }) } }) } } 属性的存储值(或作为参数传递的任何内容),并相应地设置视图的偏移量。如果需要,在此之后,它会滚动到新的,可能更改的内容的末尾。

我是iOS编程的新手,我不知道为什么它能如此有效地工作,如果有人掌握了一些相关信息,那将会很高兴知道。这种方法也可能并不完美,所以我也可以接受改进的想法。

当然感谢NixonsBack在上面的链接背后发布答案。

我的第一篇帖子:),干杯!

答案 10 :(得分:3)

以下代码可以为您提供所需的效果。

[self.scrollView setContentOffset:CGPointMake(0, -self.scrollView.contentInset.top) animated:YES];

您需要更换" self.scrollView"使用滚动视图的名称。在设置了滚动视图的文本后,您应该将此代码放入。

答案 11 :(得分:2)

这对我有用:

 override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    textView.scrollRectToVisible(CGRect(origin: CGPointZero, size: CGSizeMake(1.0, 1.0)), animated: false)

}

答案 12 :(得分:2)

UITextView文件中为ViewController.swift创建一个插座。在ViewDidLoad部分中输入以下内容:

夫特:

self.textView.contentOffset.y = 0

我试过了:

self.textView.scrollRangeToVisible(NSMakeRange(0, 0))

答案 13 :(得分:2)

这适用于Xcode 8.3.3:

$(document).ready(function() {
    var URLCheck = document.referrer || ''; // make sure referrer is a string
    var frameLocation = URLCheck.match(/:\/\/(.[^/]+)/)[1];
    if(frameLocation !== null) {
      frameLocation = frameLocation[1];
    }
    var whiteLocation = 'mywebsite.com';
    if (whiteLocation == frameLocation) {
        $('#adprimary').remove();
    }
});

答案 14 :(得分:1)

我将zeeple的答案翻译成MonoTouch / Xamarin(C#)。

public override void ViewDidLayoutSubviews()
{
    base.ViewDidLayoutSubviews();
    myForm.SetContentOffset(new CoreGraphics.CGPoint(0,0), animated: false);
}

答案 15 :(得分:0)

我必须在这里实现两个答案才能让我的观点按照我的意愿运作:

Juan Juan Cruz Serrano:

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

来自Murat Yasar:

automaticallyAdjustsScrollViewInsets = false

这给了一个UITextView,它加载了最顶部的滚动,并且一旦滚动开始就不会改变插图。非常奇怪,这不是默认行为。

答案 16 :(得分:0)

  

要每次强制textView从顶部开始,请使用以下代码:

Swift 4.2

override func viewDidLayoutSubviews() {
    textView.setContentOffset(CGPoint(x: 0, y: 0), animated: false)
}

Objective-C

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

答案 17 :(得分:0)

Swift 4.2和Swift 5

设置文本前后的内容偏移量。 (在主线程上)

let animation = false //or whatever you want
self.mainTextView.setContentOffset(.zero, animated: animation)
self.mainTextView.attributedText = YOUR_ATTRIBUTED_TEXT
self.mainTextView.setContentOffset(.zero, animated: animation)

答案 18 :(得分:-1)

在我的情况下,我在Custom tableview单元格中加载了一个textView。以下是我所做的工作,以确保textview中的文本加载到我的自定义单元格的textview中文本的顶部。

1。)在故事板中,通过取消选中按钮设置textview ScrollEnabled = false。

2。)在加载视图后,在textview上将isScrollEnabled设置为true。我设置了如下所示的小延迟:

override func awakeFromNib() {
    super.awakeFromNib()

let when = DispatchTime.now() + 1
      DispatchQueue.main.asyncAfter(deadline: when){
        self.textView.isScrollEnabled = true
     }

}

无论如何,如果您处于我的状态,请尝试将scrollEnabled设置为false,然后在加载视图时,将scrollEnabled设置为true。