当我使用 contentInset 时,我不完全理解 scrollRectToVisible

Posted

技术标签:

【中文标题】当我使用 contentInset 时,我不完全理解 scrollRectToVisible【英文标题】:I don't fully understand scrollRectToVisible when I'm using contentInset 【发布时间】:2012-03-22 10:42:28 【问题描述】:

我向 UItextView 添加了非常大的文本。我的初始偏移量是-55。然后我滚动到 UITextView 的底部。我的偏移量是 406。

然后我调用了 scrollToZero。我的偏移量是-55。我再次调用了scrollToZero,我的偏移量为0。为什么scrollToZero 如此不可预测?我不明白为什么再次单击时偏移量会发生变化。

-(void) viewDidLoad

 [super viewDidLoad];
 textView.text = @"Very big text";
 textView.contentInset = UIEdgeInsetsMake(55.0, 0, 0, 0);
 [textView scrollRectToVisible:CGRectMake(0,0,1,1) animated:NO];


-(IBAction) scrollToZero:(id)sender

 [textView scrollRectToVisible:CGRectMake(0, 0, textView.frame.size.width, textView.frame.size.height) animated:NO];

-(IBAction) onLog:(id)sender

 NSLog(@"___content offset %f", textView.contentOffset.y);

【问题讨论】:

【参考方案1】:

我一直在与这个问题作斗争。我确信这是 UIScrollView 类中的一个错误,我看不到其他解释。

首先将您的 insets 设置为零,调用 scrollRectToVisible:animated:,然后恢复您的 insets。仅当滚动到矩形位于当前矩形的“左侧”时才重要。 “权利”按预期工作。

CGRect rect = self.scrollView.bounds;
CGRect scrollToRect = CGRectOffset(rect, scrollDelta, 0);

if (CGRectIsLeftOfRect(scrollToRect, rect)) 
    UIEdgeInsets insets = self.carouselView.contentInset;
    self.scrollView.contentInset = UIEdgeInsetsZero;
    [self.scrollView scrollRectToVisible:scrollToRect animated:animated];
    self.scrollView.contentInset = insets;
 else 
    [self.scrollView scrollRectToVisible:scrollToRect animated:animated];

【讨论】:

我刚刚意识到我只有左边的插图,如果我把它们放在右边,也许当滚动到当前矩形外的一个矩形时也会出现这个问题。 scrollDelta 只是在 x 轴上滚动的一些量。我不记得上下文,但任何有效的目标偏移都应该这样做。 我在使用UICollectionView 时遇到了类似的问题,即在使用scrollRectToVisible 时更改了插图。我通过在scrollRectToVisible 调用之后设置contentInset 来解决它,如this answer中所述。看起来很像一个错误。

以上是关于当我使用 contentInset 时,我不完全理解 scrollRectToVisible的主要内容,如果未能解决你的问题,请参考以下文章

我如何处理 .FirstOrDefault 方法?

在出现键盘时处理 tableView contentInset

UIRefreshControl 不以 contentInset 集为中心

更改 UITableView 的 contentInset 而不更改其 contentOffset?

如何处理大型但不是大数据的数据集?

使用 AFIncrementalStore 时返回的部分关系数据如何处理?