1.传入图片
PreViewController.h:
#import <UIKit/UIKit.h> @interface PreViewController : UIViewController @property (nonatomic,strong) UIImage *preImage; @end
2.图片加载
PreViewController.m:
#import "PreViewController.h" @interface PreViewController () <UIScrollViewDelegate> @property (weak, nonatomic) IBOutlet UIScrollView *preView;//滚动视图 @property (nonatomic,assign) CGFloat visibleWidth;//有效显示宽度 @property (nonatomic,assign) CGFloat visibleHeight;//有效显示高度 @property (nonatomic,assign) CGFloat originalWidth;//图片居中显示原始宽度 @property (nonatomic,assign) CGFloat originalHeight;//图片居中显示原始高度 @property (nonatomic,strong) UIImageView *photoView;//图片视图 @end @implementation PreViewController - (void)viewDidLoad { [super viewDidLoad]; [self loadPhoto]; } - (void)loadPhoto { self.originalWidth = 0; self.originalHeight = 0; self.visibleWidth = CGRectGetWidth([UIScreen mainScreen].bounds); self.visibleHeight = CGRectGetHeight([UIScreen mainScreen].bounds) - [[UIApplication sharedApplication] statusBarFrame].size.height - self.navigationController.navigationBar.frame.size.height;//除去状态栏和导航栏的有效显示高度 CGFloat imageAspectRatio = self.preImage.size.width / self.preImage.size.height;//图片原始比例 CGFloat viewAspectRatio = self.visibleWidth / self.visibleHeight;//有效显示区域比例 if (imageAspectRatio > viewAspectRatio) { self.originalWidth = self.visibleWidth; self.originalHeight = self.originalWidth / imageAspectRatio; } else { self.originalHeight = self.visibleHeight; self.originalWidth = self.originalHeight * imageAspectRatio; } //居中 CGFloat originalX = (self.visibleWidth - self.originalWidth) / 2.0; CGFloat originalY = (self.visibleHeight - self.originalHeight) / 2.0; self.photoView = [[UIImageView alloc] initWithImage:self.preImage]; self.photoView.frame = CGRectMake(originalX, originalY, self.originalWidth, self.originalHeight);//图片视图在滚动视图即contentView内的位置大小 //self.preView.contentSize = self.preImage.size;//设置为原始图片大小(可乘以倍数) //缩放设置 //self.preView.zoomScale = 1.0; //self.preView.minimumZoomScale = 1.0; //self.preView.maximumZoomScale = self.preImage.size.width / self.originalWidth;
//优化
CGFloat contentWidth = MAX(self.preImage.size.width, self.visibleWidth);
CGFloat contentHeight = MAX(self.preImage.size.height, self.visibleHeight);
self.preView.contentSize = CGSizeMake(contentWidth, contentHeight);
self.preView.zoomScale = 1.0;
self.preView.minimumZoomScale = 1.0;
self.preView.maximumZoomScale = MAX(1.0, (self.preImage.size.width / self.originalWidth));
[self.preView addSubview:self.photoView];
}
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return self.photoView;//返回缩放视图
}
//根据缩放调整居中(当图片缩放到有效显示区域外则直接CGPointZero)
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale
{
CGRect rect = self.photoView.frame;
CGFloat scaleWidth = MIN(self.visibleWidth, self.originalWidth * scale);
CGFloat widthDistance = self.visibleWidth - scaleWidth;
CGFloat scaleHeight = MIN(self.visibleHeight, self.originalHeight * scale);
CGFloat heightDistance = self.visibleHeight - scaleHeight;
rect.origin.x = widthDistance / 2.0;
rect.origin.y = heightDistance / 2.0;
[UIView animateWithDuration:0.25 animations:^{ self.photoView.frame = rect; }];
}
@end
缩放过程中不会调整图片位置移动,只有在结束缩放后才动画调整居中显示,图片铺满有效显示区域后不存在居中问题,只要能显示全图即可。
此方法谈不上全面完善,只是目前看起来还不错,希望大家有好的方法可以分享~
转载请注明出处:http://www.cnblogs.com/HellerForever/p/6903534.html