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

时间:2014-09-26 22:09:24

标签: ios objective-c iphone uiscrollview uitextview

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

由于

2 个答案:

答案 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)
}