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

时间:2013-12-11 04:26:45

标签: ios objective-c uiscrollview uiimageview

基本上,我希望我的应用程序像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];
    }];
}

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

4 个答案:

答案 0 :(得分:2)

我听说这可以帮到你:

- (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);
}

答案 1 :(得分:1)

使用scrollViewWillBeginZooming:withView:保存当前的scrollView比例。 然后使用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
    }
}

答案 2 :(得分:0)

我直接从stackoverflow上的另一个问题得到了这个答案(我会尝试找到链接,以便我可以正确引用它)。我不确定它是否正是您正在寻找的,但在我的情况下,您可以放大并平移您想要的一切。然后,当您缩小到看到“黑条”的位置时,它会将图像置于屏幕中心(我将其用于可缩放的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]

答案 3 :(得分:0)

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

- (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];
    }
}