UIScrollView ContentSize 未按预期运行
Posted
技术标签:
【中文标题】UIScrollView ContentSize 未按预期运行【英文标题】:UIScrollView ContentSize Not Behaving as Expected 【发布时间】:2012-02-21 19:05:55 【问题描述】:我对@987654322@ 中的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:设置contentSize
后zoomScale
没有变化,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误报?