UIScrollView ContentSize 未按预期运行

Posted

技术标签:

【中文标题】UIScrollView ContentSize 未按预期运行【英文标题】:UIScrollView ContentSize Not Behaving as Expected 【发布时间】:2012-02-21 19:05:55 【问题描述】:

我对@9​​87654322@ 中的contentSize 属性有点困惑。我的滚动视图中有一个图像,我正在缩放和平移。我一直在为contentSize 使用不同的值,但在我看来,我输入什么值并不重要,contentSize 总是设置为图像的大小。我注意到这只发生在我执行缩放时。在我缩放之前,contentSize 会保持我设置的值,但在缩放之后,contentSize 会将自身设置为图像的大小。

我是不是误会了什么?

【问题讨论】:

如何将图像添加到滚动视图? @StephenAshley.developer [self.scrollView addSubview:image] 你是在 viewForZooming 委托方法中返回 UIImageView 吗? 是的 - 否则我怎么会得到任何缩放。我的 scrollView 工作得很好,我可以缩放我的图像等,我只是想了解 contentSize 这个奇怪的属性。 【参考方案1】:

这很有趣。根据以下- (void)scrollViewDidZoom:(UIScrollView *)scrollView的打印输出 contentSize 实际上是scrollview.frame.size x scrollview.zoomScale

- (void)scrollViewDidZoom:(UIScrollView *)scrollView 

    if ([self.scrollView zoomScale] < 1.0)[self.scrollView setZoomScale:1.0];

    NSLog (@"didZoom: ZoomScale: %.2f; ContentSize: %@; ScrollView: %@", self.scrollView.zoomScale, NSStringFromCGSize(self.scrollView.contentSize),NSStringFromCGSize(self.scrollView.frame.size));

两行打印输出:

didZoom: ZoomScale: 1.76;内容大小:1798.02, 1208.05;滚动视图:1024, 688

didZoom: ZoomScale: 1.50;内容大小:1537.94, 1033.3;滚动视图:1024, 688

在文档中没有找到这个“功能”。

编辑:还尝试了以下操作:

-(void) manualSettingOfContentSizeAndZoomScale


    NSLog (@"A: ZoomScale: %.2f; ContentSize: %@; ScrollView: %@", self.scrollView.zoomScale, NSStringFromCGSize(self.scrollView.contentSize),NSStringFromCGSize(self.scrollView.frame.size));

    self.scrollView.contentSize = CGSizeMake(1800.0,1200.0);

    NSLog (@"B: ZoomScale: %.2f; ContentSize: %@; ScrollView: %@", self.scrollView.zoomScale, NSStringFromCGSize(self.scrollView.contentSize),NSStringFromCGSize(self.scrollView.frame.size));

    self.scrollView.zoomScale = 1.8;

    NSLog (@"C: ZoomScale: %.2f; ContentSize: %@; ScrollView: %@", self.scrollView.zoomScale, NSStringFromCGSize(self.scrollView.contentSize),NSStringFromCGSize(self.scrollView.frame.size));

    self.scrollView.contentSize = self.scrollView.frame.size;

    NSLog (@"D: ZoomScale: %.2f; ContentSize: %@; ScrollView: %@", self.scrollView.zoomScale, NSStringFromCGSize(self.scrollView.contentSize),NSStringFromCGSize(self.scrollView.frame.size));

结果是:

A:缩放比例:1.00;内容大小:0, 0;滚动视图:1024, 688

B:缩放比例:1.00;内容大小:1800, 1200;滚动视图:1024, 688

C:缩放比例:1.80;内容大小:1843.2, 1238.4;滚动视图:1024, 688

D:缩放比例:1.80;内容大小:1024, 688;滚动视图:1024, 688

A:好的,据记录默认 contentSize 是 CGSizeZero(尽管 scrollView 通常显示它的内容 在 zoomScale 1.0

B:设置contentSizezoomScale没有变化,scrollView的外观也没有变化

C: 设置zoomScale contentSize 后外观发生相应变化

D:重置 contentSize 后没有任何变化 - contentSize 作为属性确实发生了变化,但不影响外观

结论:使用zoomScale设置scrollView内容的外观

如果我没记错的话 contentSize 实际上对于滚动 UIScrollView 很重要,pagingEnabled 设置为 YES。这是一个相当复杂的对象,所以也许一切都没有像人们想象或想要的那样相互关联。

【讨论】:

有趣的观察。如果您将 contentSize 设置为不同的值(例如在 viewDidLoad 中),这种关系是否仍然成立?即内容大小是否不断重置为scrollView frame*zoom? 不,见编辑。如果您设置 zoomScale,它会成立。我认为(不要为此抱我) contentSize 更多用于分页和滚动而不是缩放 - 缩放时您可以将其用作计算某些内容的信息,但您(看起来)不能通过简单设置来缩放内容不大小。看起来还可以因为设置不正确的 contentSize 会影响比例。 那是为了测试 - 非常有趣。你认为这如何与我的图像一起使用?要获得我所看到的行为,这意味着 scrollView 的 contentSize (或其现在出现的框架)正在更改以匹配图像大小 - 这似乎不正确。我会检查我的 autoScaling 等,但我很确定我的 scrollView 完全关闭了。 我认为您应该计算所需的 zoomScale (= desiredContentWidth/originalContentWidth),设置它,然后检查结果是否符合您的预期。 从我的测试中,我发现 contentSize 总是等于从viewForZooming * zoomScale 返回的视图。如果您从viewForZooming 返回 nil,则 contentSize 如果等于您手动设置的大小。

以上是关于UIScrollView ContentSize 未按预期运行的主要内容,如果未能解决你的问题,请参考以下文章

UITableView/UIScrollView 如何自动知道 ContentSize 何时发生变化?

为啥我没有得到 UIScrollView 的实际 contentSize?

KVO - UIScrollView.contentSize误报?

UIScrollView contentSize 不起作用

无法在 WKWebView 中更改 UIScrollview 的 contentSize

UIScrollView ContentSize 未按预期运行