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