Ios UIImageView内部UIScrollView平移过远

Ios UIImageView内部UIScrollView平移过远,ios,uiscrollview,uiimageview,uiscrollviewdelegate,ios6.0,Ios,Uiscrollview,Uiimageview,Uiscrollviewdelegate,Ios6.0,我在UIScrollView中有一个UIImageView问题。在Interface Builder中,UIScrollView占据整个屏幕,UIImageView占据整个UIScrollView。问题是,当我有一个面向横向的图像时,我将其设置为纵横比匹配,因此在顶部和底部有灰色条(这是我想要的)。然而,当我放大照片时,一旦照片放大到足以与屏幕垂直,我希望它不会平移到上面的灰色区域。请参阅我附加的屏幕截图。在这方面,我基本上希望它能像照片应用程序一样工作。以下是我设置UIScrollView和U

我在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; 
}

提前谢谢


Jacob

这是您的整个
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;
}
UIScrollView
的背景色设置为灰色,而不是“在顶部和底部有灰色条”

此外,不要在
viewDidLoad
中使用视图尺寸标注,因为子视图尚未布局。将其移动到
didLayoutSubviews
视图将出现
。另外,根据最大缩放设置
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;

    //  ...
}
试试这个:

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

谢谢,这个答案太好了,如果可以的话,我会接受两次:)太好了。谢谢帮助我实现了你的代码,并且在viewdide中显示:设置了动画,UIImageView边界恢复到故事板中声明的大小。您有什么线索可以触发此问题吗?@PedroBorges如果您使用自动布局,此代码段可能无法工作,您应该使用
NSLayoutConstraint
更新视图的大小。或者,您可以禁用情节提要中的自动布局,以查看是否一切都按预期运行--这可能有助于您找到问题所在。是的,我了解这一点,是的,我正在使用自动布局,但我没有为UIImageView设置约束,因此为什么它会更改大小以匹配包含的UIScrollView?