【问题标题】:UIImageView inside UIScrollView Pans Too FarUIScrollView 内的 UIImageView 平移太远
【发布时间】:2013-08-11 09:29:33
【问题描述】:

我有一个问题,我在 UIScrollView 中有一个 UIImageView。在Interface Builder中,UIScrollView占据了整个屏幕,UIImageView占据了整个UIScrollView。问题是,当我有一个面向横向的图像时,我将它设置为适合纵横比,所以我在顶部和底部都有灰色条(这是我想要的)。但是,当我放大照片时,一旦照片放大到足以垂直垂直屏幕,我希望它不会平移到其上方的灰色区域。请参阅我附上的屏幕截图。我基本上希望它在这方面像照片应用程序一样工作。这是我设置 UIScrollView 和 UIImageView 的代码:

- (void)viewDidLoad
{
   [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
   self.imageView.image = [UIImage imageNamed:@"IMG_0300.JPG"];
   self.imageView.contentMode = UIViewContentModeScaleAspectFit;
   self.scrollView.clipsToBounds = YES;
   self.scrollView.contentSize = self.imageView.bounds.size;
   self.scrollView.zoomScale = 1.0;
   self.scrollView.maximumZoomScale = 5.0;
   self.scrollView.minimumZoomScale = 1.0;

}

-(void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
   return self.imageView; 
}

提前致谢。

雅各布

【问题讨论】:

    标签: ios uiscrollview uiimageview uiscrollviewdelegate ios6.0


    【解决方案1】:

    放大的是你的整个UIImageView,不仅是它的图像,还有灰条。您的 scrollView 只是诚实地反映了这一点。你想要的结果大概可以这样实现:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        UIImage *image = [UIImage imageNamed:@"IMG_0300.JPG"];
        CGFloat ratio = CGRectGetWidth(self.scrollView.bounds) / image.size.width;
        self.imageView.bounds = CGRectMake(0, 0, CGRectGetWidth(self.scrollView.bounds), image.size.height * ratio);
        self.imageView.center = CGPointMake(CGRectGetMidX(self.scrollView.bounds), CGRectGetMidY(self.scrollView.bounds));
        self.imageView.image = image;
        self.scrollView.clipsToBounds = YES;
        self.scrollView.contentSize = self.imageView.bounds.size;
        self.scrollView.zoomScale = 1.0;
        self.scrollView.maximumZoomScale = 10.0;
        self.scrollView.minimumZoomScale = 1.0;
    
    }
    
    - (void)scrollViewDidZoom:(UIScrollView *)scrollView
    {
        UIView *subView = self.imageView;
        CGFloat offsetX = (scrollView.bounds.size.width > scrollView.contentSize.width)?
        (scrollView.bounds.size.width - scrollView.contentSize.width) * 0.5 : 0.0;
    
        CGFloat offsetY = (scrollView.bounds.size.height > scrollView.contentSize.height)?
        (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);
    }
    
    -(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
    {
        return self.imageView;
    }
    

    【讨论】:

    • 谢谢,这个答案太好了,如果可以的话,我会接受两次:)
    • 太棒了。谢谢 。帮了我很多
    • 我实现了您的代码,并且在 viewDidAppear:animated 中,UIImageView 边界恢复到故事板中声明的大小。你知道是什么触发了这个吗?
    • @PedroBorges 如果您使用自动布局,此代码 sn-p 可能不起作用,您应该使用 NSLayoutConstraint 来更新视图的大小。或者您可以禁用故事板中的自动布局,以查看一切是否按您的预期工作——这可能会帮助您找到问题。
    • 是的,我明白这一点,是的,我正在使用自动布局,但我没有为 UIImageView 设置约束,那么为什么它会更改大小以匹配包含的 UIScrollView?
    【解决方案2】:

    UIScrollView的背景颜色设置为灰色,而不是“顶部和底部都有灰色条”。

    另外,不要在viewDidLoad 中使用视图尺寸,因为子视图尚未布局。将其移至didLayoutSubviewsviewWillAppear。另外,根据您的最大缩放设置UIScrollView contentSize。例如:

    -(void)viewWillAppear:(BOOL)animated{
        [super viewWillAppear:animated];
    
        self.scrollView.backgroundColor = [UIColor lightGrayColor];  // or other color
        CGFloat maxScale = 5.0;
        self.scrollView.zoomScale = 1.0;
        self.scrollView.maximumZoomScale = maxScale;
        self.scrollView.minimumZoomScale = 1.0;
        CGSize contentSize = CGSizeMake(self.scrollView.bounds.size.width * maxScale, self.scrollView.bounds.size.height * maxScale); 
        self.scrollView.contentSize = contentSize;
    
        //  ...
    }
    

    【讨论】:

      【解决方案3】:

      试试这个:

      UIView *subView = self.imageView;
          CGFloat offsetX = (scrollView.bounds.size.width > scrollView.contentSize.width)?
          (scrollView.bounds.size.width - scrollView.contentSize.width) * 0.5 : 0.0;
      
          CGFloat offsetY = (scrollView.bounds.size.height > scrollView.contentSize.height)?
          (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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-07
        • 1970-01-01
        • 1970-01-01
        • 2014-08-20
        • 2017-06-10
        • 2011-08-10
        • 1970-01-01
        相关资源
        最近更新 更多