UIView UIScrollview - 框架,边界,中心混淆



我正在将UIImageView放在UIScrollView中,并尝试控制图像,使其在缩放后以滚动视图为中心。 我不确定这样做的最佳方法。

Apple 文档告诉我们不要使用 frame 属性:"警告 如果转换属性不是标识转换,则此属性的值未定义,因此应忽略。所以我正在尝试在 UIViewController 子类中使用以下内容,该子类的 xib 包含一个滚动视图和包含的图像视图:

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);
当包含视图的宽度和高度大于滚动视图的

宽度和高度时,这将准确工作,并设置视图,以便后续滚动将您准确地带到包含视图的边缘。但是,当图像的任一尺寸小于 scrollView 宽度和高度时,图像会被磁性吸引到屏幕的左上角。在iPad模拟器中(仅(,当图像缩小到最小缩放的大小时,它确实会锁定在屏幕中央。磁力非常平滑,就好像在图像居中后 UI 中的某些内容覆盖了我的代码。它看起来有点像CALayer内容重力(kCAGravityTopLeft(的东西,也许?

Apple在他们的代码示例中与自己的建议相矛盾,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,它会从边缘反弹,因此图像始终在左侧裁剪(当图像在两个维度上都大于其包含的滚动视图时,这个问题会加剧,并且整个结果感觉破碎,鉴于Apple记录在案的建议,这并不奇怪。

我已经搜索了论坛,找不到太多评论。我错过了一些非常明显的东西吗?

您似乎没有使用 transform 属性,因此在使用 transform 属性时可以忽略有关不使用 frame 属性的警告。继续使用frame属性,就像Apple(和我们其他人(一样。

最新更新