当我的 UIScrollView 缩放图像时,如何使框架正确居中?

Posted

技术标签:

【中文标题】当我的 UIScrollView 缩放图像时,如何使框架正确居中?【英文标题】:How do I make it so when my UIScrollView zooms an image it centers the frame properly? 【发布时间】:2013-12-11 04:26:45 【问题描述】:

基本上,我希望我的应用表现得像 Photos.app 那样。当您放大图像时,没有什么特别的事情发生,它只是使该部分变大。但是,如果您随后缩小并且图像周围有黑色字母框,它将正确居中,以便黑色边框垂直和水平平衡。所以基本上它会在需要时将其居中,否则将其保留。

许多questions and their corresponding answers 试图解决这个问题,但他们似乎都实现了它图像被缩放。如果需要,我只希望它在缩放后正确居中图像。有没有公​​认的方法来做到这一点?

现在我只是这样:

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale 
    [UIView animateWithDuration:0.3 animations:^
        [self centerViewInSuperview:self.imageBeingOverlayed];
    ];

但它被称为“当它不需要被调用时”(或者当用户特别放大某些东西以便图像不需要居中时)。我是否应该调整该方法以某种方式检测它周围何时有黑条并且不需要居中?还是有更广泛接受的方式?

【问题讨论】:

你是如何处理缩放的?我认为UIPinchGestureRecognizer 会有所帮助,因为它会在结束时通知您,并且可以执行居中动画。 如果您只希望它以缩小为中心,请将该条件添加到您的代码中。 【参考方案1】:

我听说这可以帮助你:

- (void)scrollViewDidZoom:(UIScrollView *)inscrollView

    UIView *subView = [inscrollView.subviews objectAtIndex:0];

    CGFloat offsetX = (inscrollView.bounds.size.width > inscrollView.contentSize.width)?
    (inscrollView.bounds.size.width - inscrollView.contentSize.width) * 0.5 : 0.0;

    CGFloat offsetY = (inscrollView.bounds.size.height > inscrollView.contentSize.height)?
    (inscrollView.bounds.size.height - inscrollView.contentSize.height) * 0.5 : 0.0;

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

【讨论】:

【参考方案2】:

使用scrollViewWillBeginZooming:withView: 保存您当前的滚动视图比例。 然后使用scrollViewDidEndZooming:withView:atScale: 查看当前的刻度。 如果比例低于之前的比例,您就会知道您缩小了。如果scrollViewDidEndZooming:withView:atScale: 内部是这种情况,您可以使用您在问题中编写的方法或任何其他将内容居中在 UIScrollView 中的方法来居中图像。

 (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view
 
    tempZoomScale = scrollView.zoomScale;
 


- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale

    if(scale < tempZoomScale) 
    
    // You are Zoomed out
    // Center your view in a way of your choosing
    

【讨论】:

【参考方案3】:

我直接从 *** 上的另一个问题中得到了这个答案(我会尝试找到链接,以便正确引用它)。我不确定它是否正是您要查找的内容,但就我而言,您可以随意缩放和平移。然后,当您缩小到看到“黑条”的位置时,它将使图像在屏幕上居中(我将其用于可缩放的 PDF)。

- (void)scrollViewDidZoom:(UIScrollView *)inscrollView

    UIView *subView = [inscrollView.subviews objectAtIndex:0];

    CGFloat offsetX = (inscrollView.bounds.size.width > inscrollView.contentSize.width)?
    (inscrollView.bounds.size.width - inscrollView.contentSize.width) * 0.5 : 0.0;

    CGFloat offsetY = (inscrollView.bounds.size.height > inscrollView.contentSize.height)?
    (inscrollView.bounds.size.height - inscrollView.contentSize.height) * 0.5 : 0.0;

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

如果您有特定的viewforzoominginscrollview,请将其放入代码中,而不是 [inscrollView.subviews objectAtIndex:0]

【讨论】:

【参考方案4】:

试试这个代码...它可能对你有帮助。

- (void)doubleTap:(UITapGestureRecognizer*)recognizer

    if (self.zoomScale > self.minimumZoomScale)
    
        [self setZoomScale:self.minimumZoomScale animated:YES];
    
    else
    
        CGPoint touch = [recognizer locationInView:recognizer.view];

        CGSize scrollViewSize = self.bounds.size;

        CGFloat w = scrollViewSize.width / self.maximumZoomScale;
        CGFloat h = scrollViewSize.height / self.maximumZoomScale;
        CGFloat x = touch.x-(w/2.0);
        CGFloat y = touch.y-(h/2.0);

        CGRect rectTozoom=CGRectMake(x, y, w, h);
        [self zoomToRect:rectTozoom animated:YES];
    

【讨论】:

这似乎是帮助恕我直言的一个很好的尝试,为什么不赞成?

以上是关于当我的 UIScrollView 缩放图像时,如何使框架正确居中?的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的应用重新启动时动态恢复 UIScrollView 的缩放级别和位置?

uiscrollview 中的图像显示

缩放 UIScrollView 时滚动到矩形?

IOS - UIScrollView 边框和缩放

图像缩放时在 UIScrollView 中停止滚动图像

如何区分 UIScrollView 中的平移和滚动