我需要有关UIScrollView示例的帮助。

我创建了一个简单的程序来滚动和缩放内容(UIImageView)。效果很好,只是当我尝试缩小内容时,内容经常消失在右下角。但是由于我将minimumZoomScale设置为1.0f,因此实际上并没有缩小,只有内容从 View 中跳了出来。而且更奇怪的是,在此之后我无法向上滚动。显然,内容大小也被弄乱了。

我的示例代码中的设置如下图所示。

在(尝试)缩小后检查状态时,发现两个错误。

  • _scrollView.contentSize为480x360,不得小于1000x1000
  • _scrollView.bounds以某种方式跳到顶部(即_scrollView.bounds.origin.y始终为0)

  • 为了解决以上两个问题,我在UIScrollViewDelegate中添加了以下代码,现在可以正常工作了。
    - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view
    {
        if(scrollView == _scrollView && view == _contentView)
        {
            // Setting ivars for scrollViewDidZoom
            _contentOffsetBeforeZoom = _scrollView.contentOffset;
            _scrollViewBoundsBeforeZoom = _scrollView.bounds;
        }
    }
    
    - (void)scrollViewDidZoom:(UIScrollView *)scrollView
    {
        if(scrollView == _scrollView)
        {
            // If you zoom out, there are cases where ScrollView content size becomes smaller than original,
            // even though minimum zoom scale = 1. In that case, it will mess with the contentOffset as well.
            if(_scrollView.contentSize.width < CONTENT_WIDTH || _scrollView.contentSize.height < CONTENT_HEIGHT)
            {
                _scrollView.contentSize = CGSizeMake(CONTENT_WIDTH, CONTENT_HEIGHT);
                _scrollView.contentOffset = _contentOffsetBeforeZoom;
            }
    
            // If you zoom out, there are cases where ScrollView bounds goes outsize of contentSize rectangle.
            if(_scrollView.bounds.origin.x + _scrollView.bounds.size.width > _scrollView.contentSize.width ||
               _scrollView.bounds.origin.y + _scrollView.bounds.size.height > _scrollView.contentSize.height)
            {
                _scrollView.bounds = _scrollViewBoundsBeforeZoom;
            }
        }
    }
    

    但是,是否需要归结为这一点?这是一个非常简单的过程,很难相信Apple要求我们付出这种努力。所以,我敢打赌,我在这里错过了一些东西...

    以下是我的原始代码。请帮助我找到我做错了(或缺少的东西)!
    #define CONTENT_WIDTH 1000
    #define CONTENT_HEIGHT 1000
    
      >>>> Snip >>>>
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    
        _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
        _scrollView.contentSize = CGSizeMake(CONTENT_WIDTH, CONTENT_HEIGHT);
        _scrollView.backgroundColor = [UIColor blueColor];
        _scrollView.maximumZoomScale = 8.0f;
        _scrollView.minimumZoomScale = 1.0f;
        _scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
        _scrollView.scrollEnabled = YES;
        _scrollView.delegate = self;
        [self.view addSubview:_scrollView];
    
        _contentView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"sample.jpg"]]; // sample.jpg is 480x360
        CGPoint center = (CGPoint){_scrollView.contentSize.width / 2, _scrollView.contentSize.height / 2};
        _contentView.center = center;
        [_scrollView addSubview:_contentView];
    
        _scrollView.contentOffset = (CGPoint) {center.x - _scrollView.bounds.size.width / 2, center.y - _scrollView.bounds.size.height / 2};
    }
    
    - (UIView *) viewForZoomingInScrollView:(UIScrollView *)scrollView
    {
        if(scrollView == _scrollView)
        {
            return _contentView;
        }
        return nil;
    }
    

    最佳答案

    我创建了一个快速示例项目,并遇到了与您使用粘贴的代码描述的问题相同的问题。我不完全知道iOS的“正确”缩放方式是什么,但是我找到了this教程,其中说您需要在scrollView缩放后更新contentView。我个人希望它能够自动重新居中,因为它是您在viewForZoomingInScrollView委托(delegate)方法中返回的 View ,但显然不是。

    - (void)centerScrollViewContents {
        CGSize boundsSize = _scrollView.bounds.size;
        CGRect contentsFrame = _contentView.frame;
    
        if (contentsFrame.size.width < boundsSize.width) {
            contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2.0f;
        } else {
            contentsFrame.origin.x = 0.0f;
        }
    
        if (contentsFrame.size.height < boundsSize.height) {
            contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2.0f;
        } else {
            contentsFrame.origin.y = 0.0f;
        }
    
        _contentView.frame = contentsFrame;
    }
    
    - (void)scrollViewDidZoom:(UIScrollView *)scrollView {
        // The scroll view has zoomed, so we need to re-center the contents
        [self centerScrollViewContents];
    }
    

    上面的代码不是我写的,而只是从教程中复制而来的。我认为它非常简单。另外,居中定位contentView似乎要优雅得多,然后不断更改scrollview的范围和内容大小,因此可以尝试一下。

    关于ios - 内容随UIScrollView缩小而跳,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12301635/

    10-13 04:03
    查看更多