缩放UIScrollView中的一张照片

问题描述:

我有一个UIScrollView,它唯一的缺点是从相机显示一个照片令牌或从照片库中选择。缩放UIScrollView中的一张照片

但是有一个问题 - 照片的方向,

我的意思是,“垂直”的照片(其高度>宽度的照片),与“水平”的照片(宽度>高度)。

而且我要的是一样显示在系统中的照片应用程序一张照片,

中,我可以自在缩放垂直和水平线照片

首先,这里是我的我的自定义PhotoView中的代码(主要控制UIScrolView和一个UIImageView)

// .h 
@interface PhotoView : UIView 
<UIScrollViewDelegate>{ 
    UIScrollView *myScrollView; 
    UIImageView *photoView; 
} 
... 
@end 
// .m 
- (void)refreshPhoto:(UIImage *)aPhoto { 
    if (aPhoto) { 
     CGSize photoSize = aPhoto.size; 
     CGSize scrollSize = self.myScrollView.frame.size; 
     if (photoSize.height > photoSize.width) { // vertical photo 
      self.photoView.frame = CGRectMake(0, 0, scrollSize.width, scrollSize.height); 
     } 
     else { // horizontal photo, initially it should be zoomed out to fit the width of myScrollView 
      CGFloat factor = photoSize.width/scrollSize.width; 
      self.photoView.frame = CGRectMake(0, 0, scrollSize.width, photoSize.height/factor); 
      self.photoView.center = CGPointMake(scrollSize.width/2, scrollSize.height/2); 
     } 
    } 
    else // no photo 
     self.photoView.frame = self.myScrollView.frame; 
    self.photoView.image = aPhoto; 
    //self.myScrollView.zoomScale = 1.0; 
    //self.myScrollView.contentSize = self.photoView.frame.size; 
} 
- (id)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"photoViewBg.png"]]; 
     self.myScrollView = [[[UIScrollView alloc] initWithFrame:CGRectMake(30, 35, 260, 360)] autorelease]; 
     self.myScrollView.delegate = self; 
     self.myScrollView.maximumZoomScale = 2.5; 
     self.myScrollView.minimumZoomScale = 1.0; 
     self.myScrollView.backgroundColor = [UIColor clearColor]; 
     self.photoView = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)] autorelease]; 
     self.myScrollView.contentSize = self.imageView.frame.size; 
     [self.myScrollView addSubview:self.photoView]; 
     [self addSubview:self.imageView]; 
    } 
    return self; 
} 
#pragma mark - Scroll View Delegate 
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { 
    return self.photoView; 
} 

而且我的问题是,我的代码最初工作正常垂直照片 - 无论多么大或小的照片已beening放大到,也就是说,

,当我放大,然后拖动的照片,以出myScrollView的(在设备屏幕(30,35,260,360))的帧的

它总是反弹回myScrollView的边缘。

但是当我开始处理水平照片时,事情变得困惑。

从我的代码,你可以看到,我想最初的水平照片显示,因为平放宽度>的高度,但myScrollView的宽度<高度,

所以最初,水平的人应该是在myScrollView的中间,宽度相同但高度较小,在上下两侧留下两个相等的空白,

然后当放大并滚动时,其“反弹边缘”也应该与myScrollView的边缘相同,就像垂直的。

恐怕我可怜的英语不能很清楚地表达自己,如果你没有找到我,只需在你的iOS设备上拍一张垂直和水平的照片,然后尝试在Photo应用中缩放和拖动它们,看他们最初是如何显示的以及他们如何反弹。

所以现在我不知道如何得到我想要的效果,实际上UIScrollView并没有那么清晰 - 尽管我已经读过几次文档了。

我试图改变myScrollView的contentSize调整垂直和水平的照片,但我没有做它,

,现在我总是将contentSize一样myScrollView的大小,因为我觉得myScrollView的边缘总是正确的“反弹边缘”的任何缩放照片。

但是现在这个PhotoView中有纵向和横向的照片,如照片这两个问题是完全滚出myScrollView,并成为unvisible但不反弹可言,

或上“弹跳力”是下在一段距离内myScrollView的真正上边缘和照片总是在那里反弹,总是在上面留下空白。

我不确定我是否正确理解UIScrollView的工作原理。

如若contentSize总是等于说我展示或固定myScrollView照片,

当照片被放大或缩小,并在contentSize也改变或从未?

我想我应该小心的照顾contenOffset和contentInset,但是怎么样?

希望有人能为我提供帮助!

非常感谢!

我已经解决了这一点,只是照顾contentSize和其位置(contentInset和contentOffset)的

我设法解决这个问题与下面的代码:

- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale { 
    CGSize nowSize = view.frame.size; 
    if (nowSize.height >= self.myScrollView.frame.size.height) 
     self.myScrollView.contentInset = UIEdgeInsetsZero; 
    else { 
     CGFloat delta = self.myScrollView.frame.size.height/2 - view.frame.size.height/2; 
     self.myScrollView.contentInset = UIEdgeInsetsMake(delta, 0, delta, 0); 
    } 
} 
+0

你也可以如果将此代码放在'-scrollViewDidZoom:'中,并将'view'参数更改为对可变形图像的强引用,则可以使其更平滑(缩放完成后无图像跳转)。 – 2013-09-05 09:55:34