在设置视图控制器的AttributedString(连接到UITextView)时,我遇到了一个有趣的问题。
在ViewDidLoad中,我有以下内容覆盖了我的占位符文本;
- (void)viewDidLoad
{
[super viewDidLoad];
self.contentView.attributedText = self.attributedString
}
这会以某种方式导致scrollview从显示的文本中间开始,而不是从顶部开始。
我已经尝试通过在viewDidLoad中放置[self.contentView setContentOffset:CGPointMake(0,0)animated:NO]来移动scrollview,但是这不起作用。有趣的是,我在设置了belongsText后打印出当前y位置的CGFloat,并打印出0。
奇怪的是,我添加了相同的代码来打印viewDidAppear中当前y位置的CGFloat,它是384(屏幕中间)。然后我添加了[self.contentView setContentOffset:CGPointMake(0,0)animated:NO],确定它向上滚动。
任何人都知道为什么会这样?我怎样才能使它在viewDidLoad中向上滚动到顶部?
由于
答案 0 :(得分:0)
猜测:在viewDidLoad
,控制器的视图尚未调整大小。它将被加载,然后调整到屏幕的界限。 UITextView
正在尝试智能地在调整大小时保持显示的文本粗糙区域。如果它显示在中间,那么我猜你的故事板或NIB比你正在显示的设备大,但这不是猜测的基础。
它可能有点绝望,但可能会沟通viewDidLoad
并继续:
- (void)viewWillAppear
{
if(![self.contentView.attributedText isEqual:self.attributedString])
[self updateContentViewString];
}
- (void)setAttributedString:(NSAttributedString *)string
{
_attributedString = [string copy]; // or no copy, as you prefer
[self updateContentViewString];
}
- (void)updateContentViewString
{
self.contentView.attributedText = self.attributedString;
self.contentView.contentOffset = CGPointMake(0.0, 0.0);
}
如果你想假设在视图控制器可见后文本没有更新,那就更简单了。
答案 1 :(得分:0)
如果您希望在加载ViewController时滚动到contentView的顶部,则:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Can add an if statement HERE to limit when you wish to scroll to top
contentView.setContentOffset(.zero, animated: false)
}