我把一个UIImageView在一个UIScrollView,并试图控制图像,使它在缩放后的scrollview居中。我不确定最好的方法来做到这一点。UIView UIScrollview - 框架,边界,中心混淆
苹果文档告诉我们不要使用frame属性:“警告如果transform属性不是标识转换,则此属性的值是未定义的,因此应该忽略。”所以我用试图在UIViewController子类,其厦门国际银行包含以下内容的滚动视图和包含的ImageView:
scrollView.bounds =
CGRectMake
(scrollView.contentSize.width/2 - scrollView.center.x,
scrollView.contentSize.height/2 - scrollView.center.y,
scrollView.bounds.size.width,
scrollView.bounds.size.height);
containedView.center =
CGPointMake
(containedView.bounds.size.width*scrollView.zoomScale/2,
containedView.bounds.size.height*scrollView.zoomScale/2);
这工作准确地在containedView的宽度和高度比滚动型较大,并将意见,随后的滚动将把你完全带到包含视图的边缘。然而,当图像的任何一个尺寸小于scrollView的宽度和高度时,图像被磁性吸引到屏幕的左上角。在iPad模拟器(仅限于)图像缩小到最小缩放大小时,它会锁定到屏幕中心。磁性吸引力非常平滑,就好像UI中的某些东西在图像居中后重写我的代码一样。它看起来有点像CALayer contentsGravity(kCAGravityTopLeft)的东西,也许?
苹果违背自己的意见他们的代码示例,photoScroller中(在UIScrollView中的一个子类):
// center the image as it becomes smaller than the size of the screen
CGSize boundsSize = self.bounds.size;
CGRect frameToCenter = imageView.frame;
// center horizontally
if (frameToCenter.size.width < boundsSize.width)
frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width)/2;
else
frameToCenter.origin.x = 0;
// center vertically
if (frameToCenter.size.height < boundsSize.height)
frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height)/2;
else
frameToCenter.origin.y = 0;
imageView.frame = frameToCenter;
这种方法确实在图像较小中心的一个更好的工作,但是当我试穿一下我的项目引入了一些不一致的地方。例如,对于scrollView.bounces = NO,其高度小于scrollView的高度但宽度较大(因此可以从左向右滚动)的水平图像将向左滚动比它应该的更大滚动到右边,它会在图像的边缘正确停止,但如果scrollView.bounces = YES,则它会从边缘弹起,因此图像总是在左边裁剪)当图像的尺寸大于其包含的滚动视图这个问题突出而且整个结果都被打破了,鉴于苹果的文档化建议,这并不令人惊讶。
我已经搜索了论坛,无法在此找到太多评论。我错过了真正明显的东西吗?
该方法由scrollViewDidZoom在放大和缩小时调用 - 因此转换不再是标识转换?无论如何,上面提到的框架引入了这种滚动故障。当我NSLog每个算法使用的数字,他们似乎是相同的,所以我觉得它有点神秘 – foundry
更准确地说,身份转换保持不变的scrollView但变焦改变它的imageView。所以我可以使用scrollViews的框架,但我没有用。 – foundry
我在设置算法将图像导入滚动视图时首先发现了这个小故障。我将它们设置为'纵向填充'滚动视图,并注意到图像不会总是正确导入,即使使用相同的图像,有时也会发生任意大小的调整。我停止使用框架属性,问题消失(但我获得了这个问题来弥补它!) – foundry