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

时间:2012-05-04 21:05:46

标签: ios objective-c cocoa-touch uiview uiscrollview

我在UIScrollView中放置一个UIImageView,并试图控制图像,使其在缩放后居于滚动视图的中心。我不确定这样做的最好方法。

apple doc告诉我们不要使用frame属性:“警告如果transform属性不是identity变换,则此属性的值是未定义的,因此应该被忽略。”所以我尝试在UIViewController子类中使用以下内容,其子类包含一个scrollView并包含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);

这适用于containsView的宽度和高度大于scrollView的宽度和高度,并设置视图,以便后续滚动将精确到达containsView的边缘。但是,当图像的任一尺寸小于scrollView的宽度和高度时,图像被磁性吸引到屏幕的左上角。在iPad Simulator中(仅限)当图像缩小到minimumZoom的大小时,它会锁定到屏幕的中心。磁性吸引力非常平滑,好像UI中的某些东西在图像居中后覆盖了我的代码。它看起来有点像CALayer contentsGravity(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它然后从边缘反弹,所以图像总是在左边裁剪)当图像在两个维度上都大于其包含的滚动视图这个问题更加突出,整个结果都被打破了,这一点并不令人惊讶,因为苹果提供了有据可查的建议。

我已经搜索过论坛,但对此并未发表任何评论。我错过了一些非常明显的东西吗?

1 个答案:

答案 0 :(得分:0)

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