Swift 自定义图片选择器(三) -- 图片展示界面

Swift 自定义图片选择器(三) -- 图片展示界面,第1张

首先来分析一下界面的交互:

在viewDidLoad中创建collectionView,并获取根据albumItem获取图片资源,保存到pictures,pictures就是collectionView的数据源

设置cell 的内容, 显示的是小图,并且获取大图保存起来(点击缩略图时显示大图,所以就一并获取)。

勾选、取消勾选的时候添加、移除蒙版,蒙版要添加在勾选按钮下面,这样才不会影响勾选按钮的点击响应。

需要以下设置,按钮才能根据自身的状态更改图片

判断已经勾选的数量是否大于maxCount。无论有没有超出maxCount,cell都会默认先勾选了。如果已经超出范围时,需要取消勾选。

如果是没有超出maxCount的勾选,则将图片添加到已选数组。如果是取消勾选,则在已选数组中移除。

想要访问相册,首先的获得系统的授权。在app的配置文件info.plist中添加一下项:(添加相册项即可)

然后获取相册授权状态,如果你的app没有进行过授权的话,是授权状态一般是.notDetermined,此时需要请求授权。

将跳转到Picker的方法封装在PickerHelper中,然后用户就可以调用这个方法直接使用Pikcer

用户调用Picker

App中圆角常用的场景有:UIImageView(头像及cell中图片)、Button按钮(按钮)、Label文字(文字)等等。这些控件的圆角设置原理都是一样的,这里就以UIImageView圆角设置为例。

1.系统提供的圆角设置属性:

cornerRadius属性本身并没有什么问题,而masksToBounds属性会造成离屏渲染从而影响性能。

ps:Offscreen rendering(离屏渲染):离屏渲染指的是在图像在绘制到当前屏幕前,需要先进行一次渲染,之后才绘制到当前屏幕。在第一次渲染时,GPU(Core Animation)或CPU(Core Graphics)需要额外的一块内存来进行渲染,完成后再绘制到屏幕。offscreen到onscreen需要进行上下文切换,这个切换的性能消耗是昂贵的。

事实上,当界面中单个或少量控件用此方法设置圆角,并不会影响性能,我们并不需要担心,但如果界面中大量使用此方法设置圆角,比如TableView中显示圆角图片等,滚动时就会出现界面卡顿,这当然不是我们想要看到的。

2.为了不让图像离屏渲染:

可以自己绘制圆角:

//也可以直接用贝塞尔设置圆形路径进行绘制

对上面两个绘制圆角的方法性能进行了简单的测试,分别进行多轮的100次测试,时间消耗上差别基本无几,大家可以选择任何一种方法使用。

ps: UIGraphicsBeginImageContextWithOptions方法参数说明:

size —- 图形上下文的大小

opaque —- 透明开关,如果图形完全不用透明,设置为YES以优化位图的存储。

scale —– 缩放因子,可以用[UIScreen mainScreen].scale来获取,但实际上设为0后,系统就会自动设置正确的比例了。在Retina屏幕上最好不要自己手动设置他的缩放比例,直接设置0,系统就会自动进行最佳的缩放

关键在于:绘制圆角最好在子线程进行,这样不会阻塞主线程,用户体验上会更好,特别是对于UITableView列表这样的场景,异步绘制是必须的,不然UITableView滑动可能会出现卡顿的情况。

可以将设置圆角方法放在UIImageView+Extension.swift(Swift在3.0以后没有Category,Extension文件之分了)文件中,创建setCornerImage方法:

在需要设置圆角的地方直接调用即可,例如:

Swift - 实现图片(UIImage)的水平翻转(镜像),垂直翻转

有时候我们需要对图片(UIImage)进行垂直翻转(上下翻转),或者水平翻转处理(即镜像处理)。如下图:

通常有两种方式。

1,实现原理

UIImage 有个属性叫 imageOrientation,它是一个枚举变量。主要作用是控制image的绘制方向,共有以下8种方向:

那么我们只需要通过改变 UIImage 的 orientation,这样图片显示出来的时候,图片容器会根据新的这个 orientation 属性进行显示。从而实现水平翻转或者垂直翻转。

2,水平翻转(即左右镜像)

3,垂直翻转

1,实现原理

方法1是通过改变 UIImage 的 orientation 实现翻转的,也就是说它只是改变了一个标记而已。

它内部的图片数据其实还是原始的数据,如果翻转图片不是用来显示,而是需要用于图像识别、图像处理等 *** 作那上面那个方法就不适合了。

本方法是将 UIImage 的图片原始数据数组进行重排,从而实现翻转。其实现的关键点是在Core Graphics(Quartz)层面上重绘图片。

2,水平翻转(即左右镜像)

由于Core Graphics(Quartz) 与 UIKit 的y轴坐标系是相反的,先绕原点旋转180度,再平移一下就好了

3,垂直翻转

垂直翻转更简单了。由于 Core Graphics(Quartz) 与 UIKit 的y轴坐标系是相反的,UIKit是y轴向下,Quartz是y轴向上。直接绘制就是垂直翻转的。

注:如何防止由于图片重绘造成显示模糊

由于使用视网膜屏,我的原始图片是 hangge@2x.png。如果使用第二方法,即通过重绘来实现图片翻转并显示出来。那么在创建图形上下文的时候就需要设置好放大倍数。而不能简单地直接 UIGraphicsBeginImageContext(rect.size) 来创建。

1

2

//根据size大小创建一个基于位图的图形上下文

UIGraphicsBeginImageContextWithOptions(rect.size, false, 2)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11317230.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存