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 = ;
self.originalHeight = ;
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

【原创】iOS图片预览(支持缩放和移动)的更多相关文章

  1. 使用canvas实现图片预览、缩放(压缩)以及生成文件下载

    参考 https://www.runoob.com/html/html5-canvas.html https://www.cnblogs.com/yuanzhiguo/p/8288822.html h ...

  2. iOS图片预览、放大缩小

    思路 图片预览,优先考虑基础控件UIImageView.UIButton 图片预览中可能需设置不同的mode,优先考虑UIImageView typedef NS_ENUM(NSInteger, UI ...

  3. 手机端图片预览和缩放js

    转至:http://blog.sina.com.cn/s/blog_c342e3090102vcxu.html 1.手机端的图片选择和预览 <input type="file" ...

  4. html5 图片上传,支持图片预览、压缩、及进度显示,兼容IE6+及标准浏览器

    以前写过上传组件,见 打造 html5 文件上传组件,实现进度显示及拖拽上传,兼容IE6+及其它标准浏览器,对付一般的上传没有问题,不过如果是上传图片,且需要预览的话,就力有不逮了,趁着闲暇时间,给上 ...

  5. Android 手势检测实战 打造支持缩放平移的图片预览效果(下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39480503,本文出自:[张鸿洋的博客] 上一篇已经带大家实现了自由的放大缩小图 ...

  6. 适用于各浏览器支持图片预览,无刷新异步上传js插件

    文件上传无疑是web应用中一个非常常用的功能,不管是PHP.jsp还是aspx.mvc等都会需要文件上传,但是众所周知当使用自带的文件上传功能时总会出现页面刷新的情况.当然现在有了html5这个好东西 ...

  7. js实现移动端图片预览:手势缩放, 手势拖动,双击放大...

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  8. JS 解决 IOS 中拍照图片预览旋转 90度 BUG

    上篇博文[ Js利用Canvas实现图片压缩 ]中做了图片压缩上传,但是在IOS真机测试的时候,发现图片预览的时候自动逆时针旋转了90度.对于这个bug,我完全不知道问题出在哪里,接下来就是面向百度编 ...

  9. 手动实现图片预览-放大缩小全屏支持IE9以上

    #{extends '/Index/index.html' /} #{set title:'意见反馈' /} <script src="/public/mgr/javascripts/ ...

随机推荐

  1. 在jsp中用一数组存储了数据库表中某一字段的值,然后在页面中输出其中的值。

    List<String> list = new ArrayList<String>();  String sql = "select userName from us ...

  2. 文本处理sed常用操作

    文本处理sed常用操作 linux sed (stream editor) is a Unix utility that parses and transforms text, using a sim ...

  3. contos 7/redhat 7 安装mysql

    1.给网卡配置ip.掩码.网关   2.添加dns,编辑文件:/etc/resolve.conf nameserver 202.96.209.133       //上海本地dns nameserve ...

  4. 【转】JDBC学习笔记(7)——事务的隔离级别&批量处理

    转自:http://www.cnblogs.com/ysw-go/ 数据库事务的隔离级别 对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发 ...

  5. JS 部分基础内容总结

    JavaScript 是脚本语言 HTML 中的脚本必须位于 <script> 与 </script> 标签之间. 脚本可被放置在 HTML 页面的 <body> ...

  6. Linux 练习(1)

    1) 新建用户natasha,uid为1000,gid为555,备注信息为"master" useradd -u 1000 -g 555 -c 'master' natasha2) ...

  7. sass学习入门篇(三)

    这章我们讲“嵌套”,嵌套包括两种:一,选择器嵌套.二是属性的嵌套.一般用选择器嵌套居多 一,选择器嵌套:指的是在一个选择器中嵌套另一个选择器来实现继承.使用&表示父元素选择器 li{ floa ...

  8. Java计算两个程序运行时间

    一.获取系统当前时间 long startTime = System.currentTimeMillis(); //获取开始时间 doSomething(); //测试的代码段 long endTim ...

  9. sql server 2008 数据库管理系统使用SQL语句创建登录用户详细步骤

    --服务器角色:--固定服务器角色具有一组固定的权限,并且适用于整个服务器范围. 它们专门用于管理 SQL Server,且不能更改分配给它们的权限. --可以在数据库中不存在用户帐户的情况下向固定服 ...

  10. oracle修改有数据的字段属性

    正常情况下,有数据时不能直接修改属性,我们可以先备份,然后清空现有数据,然后再修改和还原,过程如下: //先缓存表CREATE TABLE T_TABLE1 AS SELECT * FROM tabl ...