在viewDidLoad中设置NSAttributedString会导致Scrollview在文本中间而不是顶部开始

问题描述 投票:0回答:2

在设置视图控制器的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中向上滚动到顶部?

谢谢

ios objective-c iphone uiscrollview uitextview
2个回答
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);
}

或者,如果您想假设视图控制器可见后文本未更新,则可以更简单。


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)
}
© www.soinside.com 2019 - 2024. All rights reserved.