我有一个 UIScrollView,它唯一的任务是显示来自相机的单个照片令牌或从照片库中选择。
但是有一个问题——照片的方向,
我的意思是,“垂直”照片(高度 > 宽度的照片)与“水平”照片(宽度 > 高度)相对。
而我想要的就像在系统照片应用程序中显示单张照片一样,
我可以在其中舒适地缩放垂直和水平照片
首先,这是我的自定义 PhotoView 的代码(主要控制 UIScrollView 和 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;
}
我的问题是,我的代码最初适用于垂直照片 - 无论照片放大到多大或多小,也就是说,
当我缩放然后将照片拖出 myScrollView 的框架(设备屏幕中的(30、35、260、360))时,
它总是弹回 myScrollView 的边缘。
但是当我开始处理水平照片时,事情就变得混乱了。
从我的代码中,您可以看到我最初想要的水平照片是,因为水平照片的宽度>它们的高度,但 myScrollView 的宽度<高度,
所以最初,水平的应该在myScrollView的中间,宽度相同但高度较小,上下两侧留两个相等的空白,
那么在缩放和滚动时,它的“反弹边缘”也应该与 myScrollView 的边缘相同,就像垂直边缘一样。
恐怕我的英语不好表达的很清楚,如果你听不懂,就用你的IOS设备拍一张垂直和水平的照片,然后在照片应用程序中尝试缩放和拖动它们,看看它们如何最初显示以及它们如何反弹。
所以现在,我不知道如何获得我想要的效果,实际上我对 UIScrollView 不太清楚 - 尽管我已经阅读了几次文档。
我试图改变 myScrollView 的 contentSize 来调整垂直和水平的照片,但我还没有做到,
现在我总是将 contentSize 设置为与 myScrollView 的大小相同,因为我认为 myScrollView 的边缘对于任何缩放的照片始终是正确的“反弹边缘”。
但是现在这个photoView对于纵向和横向的照片都有问题,比如照片完全滚动出myScrollView,变得不可见但根本弹不回来,
或者上部的“反弹边缘”在 myScrollView 的真实上边缘下方一段距离,照片总是反弹回来,上面总是留下空白。
我不确定我是否正确理解 UIScrollView 的工作原理。
如果 contentSize 始终等于我正在显示或固定到 myScrollView 的照片,
当照片放大或缩小时, contentSize 是否也发生了变化?
我想我应该小心处理 contenOffset 和 contentInset,但是如何处理呢?
希望有人可以为我提供帮助!
非常感谢!