在没有contentInset的UIScrollView中居中UIImageView?

时间:2009-09-18 16:04:04

标签: iphone uiscrollview uiimageview

我一直无法找到这个问题的答案。

我在UIScrollView中有一个UIImageView,我希望中心的内容是垂直的。

现在,我能够做到这一点的唯一方法是根据UIImageView大小的高度设置滚动视图的contentInset,但这不是一个完美的解决方案;它只是增加了UIImageView的大小,使得UIScrollView'认为'它的内容更大,并将这些黑条添加到顶部。

我试图从以下方面获得帮助:

UIScrollView with centered UIImageView, like Photos app

Center content of UIScrollView when smaller

但是无法使用这些答案来解决它。

6 个答案:

答案 0 :(得分:6)

此代码适用于大多数iOS版本(已经过测试,可以在3.1版本上运行,这是我目前可以访问的所有版本)。

它基于Jonah的回答中提到的Apple WWDC代码。

将以下内容添加到UIScrollView的子类中,并将tileContainerView替换为包含图像或切片的视图:

- (void)layoutSubviews {
    [super layoutSubviews];

    // center the image as it becomes smaller than the size of the screen
    CGSize boundsSize = self.bounds.size;
    CGRect frameToCenter = tileContainerView.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;

    tileContainerView.frame = frameToCenter;
}

答案 1 :(得分:4)

您可以通过调用scrollRectToVisible:animated:

告诉UIScrollView滚动到特定视图

示例:

[myScrollView scrollRectToVisible:imageView.frame animated:YES];

要将其垂直居中,请尝试以下操作:

1)在滚动视图中添加一个与您的contentSize高度相同的空视图。

2)将UIImageView添加到emptyView的中心

2)此{em>空视图中的scrollRectToVisible

答案 2 :(得分:1)

创建一个单独的uiview并添加以此为中心的UIImageView,然后将视图添加到scrollview

UIView *view = [[UIVIew alloc] initWithFrame:<frame that will fill your scrollview>];
CGRect frame = CGRectMake((view.size.width - IMAGE_WIDTH)/2, (view.size.height - IMAGE_HEIGHT)/2, IMAGE_WIDTH, IMAGE_HEIGHT);
UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame];
imageView.image = [UIImage imageNamed:@"imageSized_IMAGE_WIDTH_by_IMAGE_HEIGHT.png"];
[view addSubview:imageView];
[imageView release];

[scrollView addSubview:view];
[view release];

请注意,您需要将视图框设置为滚动视图中所需的尺寸和位置。需要注意的重要部分是使用视图框架尺寸作为变量将视图框架内的图像视图居中。

答案 3 :(得分:1)

Apple已向iphone开发者计划的所有成员发布了2010 WWDC会话视频。讨论的主题之一是他们如何创建照片应用程序!他们逐步构建一个非常相似的应用程序,并使所有代码免费提供。

它也不使用私人api。由于非公开协议,我不能在此处放置任何代码,但这里是示例代码下载的链接。您可能需要登录才能获得访问权限。

http://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/wa/getSoftware?code=y&source=x&bundleID=20645

并且,这是iTunes WWDC页面的链接:

http://insideapple.apple.com/redir/cbx-cgi.do?v=2&la=en&lc=&a=kGSol9sgPHP%2BtlWtLp%2BEP%2FnxnZarjWJglPBZRHd3oDbACudP51JNGS8KlsFgxZto9X%2BTsnqSbeUSWX0doe%2Fzv%2FN5XV55%2FomsyfRgFBysOnIVggO%2Fn2p%2BiweDK%2F%2FmsIXj

答案 4 :(得分:0)

这可以帮助

myImageView.autoresizingMask = UIViewAutoresizingFlexibleWidth;

http://developer.apple.com/iPhone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instp/UIView/autoresizingMask

基本上你可以用autoresizingMask做的是你可以在其父视图中控制该视图的“锚点”,就像你使用Interface Builder一样

答案 5 :(得分:0)

contentInset不应该更改contentSize,它应该更改contentOffset。

尝试设置contentSize,然后设置contentInset。还要查看UIScrollView的背景颜色以及可能在其后面显示的内容。我可以使用setContentSize,setContentInset和addSubview将UIImageView集中在UIScrollView中。