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. 基于Spring Security 的JSaaS应用的权限管理

    1. 概述 权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源.资源包括访问的页面,访问的数据等,这在传统的应用系统中比较常见.本文介绍的则是基于Saas系统 ...

  2. 使用RandomAccessFile类对文件进行读写

    1. RandomAccessFile类简介   前面一篇随笔<File类遍历目录及文件>中有说到,File类只能用于表示文件或目录的名称.大小等信息,而不能用于文件内容的访问.而当需要访 ...

  3. 手机QQ无法临时会话的解决方案

    手机网页发起临时会话:    <a href="mqqwpa://im/chat?chat_type=wpa&uin=3355135984&version=1& ...

  4. 读书笔记 effective c++ Item 50 了解何时替换new和delete 是有意义的

    1. 自定义new和delete的三个常见原因 我们先回顾一下基本原理.为什么人们一开始就想去替换编译器提供的operator new和operator delete版本?有三个最常见的原因: 为了检 ...

  5. 【转载】rem自适应布局-移动端自适应必备

    原文链接:rem自适应布局-移动端自适应必备 版权所有,转载时请注明出处,违者必究. 由于移动端特殊性,本文讲的是如何使用rem实现自适应,或叫rem响应式布局,通过使用一个脚本就可以rem自适应,不 ...

  6. java中创建对象中使用默认构造函数的注意点

    public class Test3 {   private int n;   Test3() {      System.out.println("调用默认构造器");   }  ...

  7. Extjs6(一)——用sencha cmd建立一个ExtJs小项目

    本文基于ext-6.0.0 一.用sencha cmd建立一个ExtJs小项目 首先,需要一个命令行工具.进入extjs所在目录. 然后,输入:sencha -sdk [ExtJs6.0文件夹地址] ...

  8. C语言学习的第一章

    首先,学习编写程序要先知道什么是程序,我们为什么要写程序? 程序就是为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合.程序里有很多算法,算法是解决问题的具体方法和步骤,就像我们想要得 ...

  9. .NET遇上Docker - Docker集成Cron定时运行.NETCore(ConsoleApp)程序.md

    配置项目的Docker支持 对于VS中Docker的配置,依旧重复一些废话. 给项目添加Docker支持,VS2015可以直接使用Docker for VS插件,VS2017在安装时选择容器支持.VS ...

  10. 在SCIKIT中做PCA 逆运算 -- 新旧特征转换

    PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...