ios - 较小时 UIScrollView 的中心内容

我在用于缩放和滚动的 UIScrollView 中有一个 UIImageView。如果 ScrollView 的图像/内容大于 ScrollView ,则一切正常。但是,当图像变得小于 ScrollView 时,它会粘在 ScrollView 的左上角。我想让它保持居中,就像照片应用程序一样。

关于在 UIScrollView 的内容较小时保持居中的任何想法或示例?

我正在使用 iPhone 3.0。

以下代码几乎可以工作。如果我在达到最小缩放级别后捏它,图像会返回到左上角。

- (void)loadView {
    [super loadView];

    // set up main scroll view
    imageScrollView = [[UIScrollView alloc] initWithFrame:[[self view] bounds]];
    [imageScrollView setBackgroundColor:[UIColor blackColor]];
    [imageScrollView setDelegate:self];
    [imageScrollView setBouncesZoom:YES];
    [[self view] addSubview:imageScrollView];

    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"WeCanDoIt.png"]];
    [imageView setTag:ZOOM_VIEW_TAG];
    [imageScrollView setContentSize:[imageView frame].size];
    [imageScrollView addSubview:imageView];

    CGSize imageSize = imageView.image.size;
    [imageView release];

    CGSize maxSize = imageScrollView.frame.size;
    CGFloat widthRatio = maxSize.width / imageSize.width;
    CGFloat heightRatio = maxSize.height / imageSize.height;
    CGFloat initialZoom = (widthRatio > heightRatio) ? heightRatio : widthRatio;

    [imageScrollView setMinimumZoomScale:initialZoom];
    [imageScrollView setZoomScale:1];

    float topInset = (maxSize.height - imageSize.height) / 2.0;
    float sideInset = (maxSize.width - imageSize.width) / 2.0;
    if (topInset < 0.0) topInset = 0.0;
    if (sideInset < 0.0) sideInset = 0.0;
    [imageScrollView setContentInset:UIEdgeInsetsMake(topInset, sideInset, -topInset, -sideInset)];
}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return [imageScrollView viewWithTag:ZOOM_VIEW_TAG];
}

/************************************** NOTE **************************************/
/* The following delegate method works around a known bug in zoomToRect:animated: */
/* In the next release after 3.0 this workaround will no longer be necessary      */
/**********************************************************************************/
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale {
    [scrollView setZoomScale:scale+0.01 animated:NO];
    [scrollView setZoomScale:scale animated:NO];
    // END Bug workaround

    CGSize maxSize = imageScrollView.frame.size;
    CGSize viewSize = view.frame.size;
    float topInset = (maxSize.height - viewSize.height) / 2.0;
    float sideInset = (maxSize.width - viewSize.width) / 2.0;
    if (topInset < 0.0) topInset = 0.0;
    if (sideInset < 0.0) sideInset = 0.0;
    [imageScrollView setContentInset:UIEdgeInsetsMake(topInset, sideInset, -topInset, -sideInset)];
}

最佳答案

我有一个非常简单的解决方案! 您只需在放大 ScrollViewDelegate 时更新 subview ( ImageView )的中心。 如果缩放图像小于 ScrollView ,则调整 subview.center 否则中心为 (0,0)。

- (void)scrollViewDidZoom:(UIScrollView *)scrollView 
{
    UIView *subView = [scrollView.subviews objectAtIndex:0];

    CGFloat offsetX = MAX((scrollView.bounds.size.width - scrollView.contentSize.width) * 0.5, 0.0);
    CGFloat offsetY = MAX((scrollView.bounds.size.height - scrollView.contentSize.height) * 0.5, 0.0);

    subView.center = CGPointMake(scrollView.contentSize.width * 0.5 + offsetX, 
                                 scrollView.contentSize.height * 0.5 + offsetY);
}

https://stackoverflow.com/questions/1316451/

相关文章:

iphone - 从实例中获取类的名称

ios - 无法同时满足约束,将尝试通过打破约束来恢复

ios - 如何在 UITableView 中设置分隔符的全宽

objective-c - 为什么在 C 中将 1,000,000,000 写为 1000*1000

ios - iPhone SDK : what is the difference between

objective-c - NSInvocation 傻瓜?

objective-c - "FOUNDATION_EXPORT"与 "extern"

ios - 如何设置一个简单的委托(delegate)来在两个 View Controller 之间

ios - UIView 隐藏/显示动画

objective-c - Swift References 中的 _ 下划线代表什么?