加载时,UITextView不滚动到顶部
当我有不填充UITextView的文本,它滚动到顶部按预期工作。 当有更多的文字比在屏幕上适合,UITextView滚动到文本的中间,而不是顶部。
以下是一些潜在的相关细节:
在viewDidLoad中给UITextView的顶部和底部填充一些内容:
self.mainTextView.textContainerInset = UIEdgeInsetsMake(90, 0, 70, 0);
UITextView使用自动布局将其从顶部,底部和屏幕的每一侧(在IB中完成)锚定20px以允许不同的屏幕大小和方向。
一旦载入,我仍然可以用手指滚动它。
编辑我发现删除自动布局的约束,然后修复宽度只能解决问题,但只为该屏幕宽度。
UITextView是UIScrollView的子类,所以你可以使用它的方法。 如果所有你想要做的是确保它滚动到顶部,那么无论文本添加尝试:
[self.mainTextView setContentOffset:CGPointZero animated:NO];
编辑:任何种类的滚动视图的AutoLayout得到快速。 设置一个固定的宽度解决这并不奇怪。 如果在-viewDidLayoutSubviews
中-viewDidLayoutSubviews
,那很奇怪。 手动设置布局约束可能会起作用。 首先在IB中创build约束条件:
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *textViewWidthConstraint; @property (weak, nonatomic) IBOutlet NSLayoutConstraint *textViewHeightConstraint;
然后在ViewController中
-(void)updateViewConstraints { self.textViewWidthConstraint.constant = self.view.frame.size.width - 40.0f; self.textViewHeightConstraint.constant = self.view.frame.size.height - 40.0f; [super updateViewConstraints]; }
在-viewDidLayoutSubviews
中设置-viewDidLayoutSubviews
仍然有必要。
(另一种方法是在textView和它的superView之间创build一个“等宽”和“等高”的布局约束,常量为“-40”,如果常量为零,否则按常量进行调整,但是因为只能将这个约束添加到一个视图来约束两个视图,所以在IB中不能这样做)。
你可能会问自己,如果我必须这样做,AutoLayout有什么意义? 我已经深入研究了AutoLayout,这是一个很好的问题。
将以下函数添加到您的视图控制器类…
Swift 3
override func viewDidLayoutSubviews() { self.mainTextView.setContentOffset(.zero, animated: false) }
Swift 2.1
override func viewDidLayoutSubviews() { self.mainTextView.setContentOffset(CGPointZero, animated: false) }
目标C
- (void)viewDidLayoutSubviews { [self.mainTextView setContentOffset:CGPointZero animated:NO]; }
我有同样的问题! 重置为build议的约束,只是把(Y偏移)
@IBOutlet weak var textContent: UITextView! override func viewDidLoad() { textContent.scrollsToTop = true var contentHeight = textContent.contentSize.height var offSet = textContent.contentOffset.x var contentOffset = contentHeight - offSet textContent.contentOffset = CGPointMake(0, -contentOffset) }
迅速
self.textView.scrollRangeToVisible(NSMakeRange(0, 0))
OBJ-C
[self.textView scrollRangeToVisible:(NSMakeRange(0, 0))];
对于iOS9及更高版本,甚至在viewWillAppear上的textview:CGRect(0,0,1000,1000)。 为了这个工作,你必须调用viewWillAppear:
[self.view setNeedsLayout]; [self.view layoutIfNeeded]; // * Your code here
之后,textview将有正确的CGRect数据,您可以执行您可能需要的任何滚动操作。
如果你不想约束:
override func updateViewConstraints() { super.updateViewConstraints() } override func viewDidLayoutSubviews() { self.textLabel.setContentOffset(CGPointZero, animated: false) }
把代码放在viewDidLayoutSubviews和viewWillLayoutSubviews中的问题是,这些方法被称为很多(在设备旋转,调整视图等…)。 如果您正在从文本视图中读取某些内容,并且旋转了设备,则预计您正在查看的部分内容会保留在屏幕上。 你不希望它滚动回顶部。 尝试将文本视图的scrollEnabled属性设置为NO(false),并在viewDidAppear中将其重新打开,而不是将内容滚动到顶部。
- 如何在iOS 8中使用Touch ID传感器
- 通过string删除所有重音
- 设置里面只有图像(可变高度)的UITableViewCell的dynamic高度
- 如何在自定义类型的UIButton中设置图像视图的颜色?
- 优化iPhone / iPod touch上的二进制应用程序大小
- UITextView顶部边距
- AVAssetWriter祸患
- Bridging-header.h导致命令/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc失败,退出代码1
- 通过UIBezierPath移动CALayer