【问题标题】:UIScrollView moves image to the top left corner when zooming inUIScrollView 放大时将图像移动到左上角
【发布时间】:2012-02-05 14:52:03
【问题描述】:

看看这个问题:Prevent UIScrollView from moving contents to top-left,我遇到了确切的问题。

我正在使用本教程:http://cocoadevblog.heroku.com/iphone-tutorial-uiimage-with-zooming-tapping-rotation

回到类似的问题,如果我禁用 UIScrollViewPanGestureRecognizer,我将无法再平移缩放的图像。

我在 UIScrollView 中有一个 UIImageView,我也希望能够缩放和平移图像。

如何在放大时禁用内容移动到左上角?

【问题讨论】:

    标签: objective-c uiscrollview uiimageview


    【解决方案1】:

    似乎我解决了在尺寸检查器\属性检查器中调整我的 UiScrollView Autosizing 和 Origin 的问题。我取消选中 Paging Enabled,神奇的事情发生了。

    【讨论】:

      【解决方案2】:

      以防万一其他人来这里并且其他答案似乎都不起作用(这是我的情况),我的诀窍是设置滚动视图的 contentSize。只需将其设置为您要放大的任何子视图的大小,它应该可以工作。

      【讨论】:

        【解决方案3】:

        创建一个 UIScrollView 的子类,并在其中添加这个方法:

        - (void)layoutSubviews {
            [super layoutSubviews];
        
            // center the image as it becomes smaller than the size of the screen
            CGSize boundsSize = self.bounds.size;
        
            //get the subView that is being zoomed
            UIView *subView = [self.delegate viewForZoomingInScrollView:self];
        
            if(subView)
            {
            CGRect frameToCenter = subView.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;
        
            subView.frame = frameToCenter;
            }
        
            else
                NSLog(@"No subView set for zooming in delegate");
        }
        

        【讨论】:

        • 您注意到任何变化吗?如果你不这样做,那么你做错了什么,因为这应该可以正常工作。
        • 让我们一步一步来。 subView 是另一个 UIScrollView 对吗?我缺少 layoutSubviews 来了解它是什么。
        • 所以你有一个滚动视图。用 UIScrollView 的自定义子类替换该滚动视图。在自定义类的实现(.m 文件)中,添加上述方法。不,subView 不是另一个滚动视图,它是您应用缩放的视图。您应该已经在代码中的某处实现了 viewForZoomingInScrollView,否则您将无法缩放任何东西!
        • 感谢您的解释。我是新手,我需要了解!顺便说一句,是的,我实现了那个方法!我会试试的
        • 没有。你有一个滚动视图 - 摆脱它。将其替换为您创建的作为 uiscrollview 子类的类。添加上面的方法。 .
        【解决方案4】:

        如果我理解正确,您只想在ImageView 放大时允许滚动,然后是scrollView.zoomScale &gt; 1。对于我的应用需求,我正在使用它。

        如下添加UIScrollView的delegate方法并检查。

        - (void)scrollViewDidScroll:(UIScrollView *)aScrollView
        {
            CGFloat offsetY = 0;
            if (aScrollView.zoomScale > 1)
                offsetY = aScrollView.contentOffset.y;
        
            [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, offsetY)];
        }
        

        【讨论】:

        • 嗨 Tanya,您正在回答一个已经正确回答的非常古老的问题。您能否在帖子中解释为什么您的答案比其他答案更好或在某些情况下更可取?
        猜你喜欢
        • 2017-08-16
        • 1970-01-01
        • 2011-07-16
        • 1970-01-01
        • 2016-01-30
        • 2016-01-08
        • 1970-01-01
        • 1970-01-01
        • 2020-03-22
        相关资源
        最近更新 更多