如果为true,就说明是非UI线程访问了这个控件,于是就需要调用这两个方法之一,将 *** 作UI的函数封装到UI线程上去执行。其中Invoke是阻塞
的,BeginInvoke是异步的。
2)利用同步上下文调度器
.Net4.0增加了一个线程 *** 作的类Task。Task的Start方法或ContinueWith方法中可以指定一
个任务调度器TaskScheduler,如果这个任务调度器是同步上下文调度器,那么在Task的方法中就可以访问UI控件。要得到一个同步上下文调度
器,需要通过TaskScheduler的静态方法FromCurrentSynchronizationContext。
3)利用同步上下文SynchronizationContext
这个类很重要,利用这个类可以大大简化我们的异步更新UI界面的代码。避免了和
线程间的无尽纠缠。利用SynchronizationContext的Current可以得到当前线程的同步上下文。注意,如果你在非UI线程上调用,
会得到null。所以我们需要在UI线程上首先得到它的一个引用。然后在任务线程里就可以用这个引用变量。利用它的Send或Post方法将我们的更新
UI的函数封送到UI线程上执行。对于WinForm程序来说Current返回的是
WindowsFormsSynchronizationContext,它是SynchronizationContext的一个子类。Send或
Post方法内部其实还是使用的Control.Invoke或Control.BeginInvoke来实现的。
首先来分析一下界面的交互:
在viewDidLoad中创建collectionView,并获取根据albumItem获取图片资源,保存到pictures,pictures就是collectionView的数据源
设置cell 的内容, 显示的是小图,并且获取大图保存起来(点击缩略图时显示大图,所以就一并获取)。
勾选、取消勾选的时候添加、移除蒙版,蒙版要添加在勾选按钮下面,这样才不会影响勾选按钮的点击响应。
需要以下设置,按钮才能根据自身的状态更改图片
判断已经勾选的数量是否大于maxCount。无论有没有超出maxCount,cell都会默认先勾选了。如果已经超出范围时,需要取消勾选。
如果是没有超出maxCount的勾选,则将图片添加到已选数组。如果是取消勾选,则在已选数组中移除。
想要访问相册,首先的获得系统的授权。在app的配置文件info.plist中添加一下项:(添加相册项即可)
然后获取相册授权状态,如果你的app没有进行过授权的话,是授权状态一般是.notDetermined,此时需要请求授权。
将跳转到Picker的方法封装在PickerHelper中,然后用户就可以调用这个方法直接使用Pikcer
用户调用Picker
准备1
打开此系统之前我们创建的「PersonalAccounts」应用,并切换到「Main.storyboard」文件。
2
切换到主面板,并关闭左侧项目树
3
删除之前拖入的Label
4
打开之前你已经做好的设计样稿
END
绘制界面
首先,我们先画第一个界面,通过观察设计样稿知道,这个界面需要的控件有Label、Button、Image View、Table View。
根据设计样稿,我们将对应的控件从「对象仓库」中拖入对应的控件,并摆放到相应的位置中。
ps:Image View用于绘制设计样稿中的那个矩形框。Table View用于呈现明细列表。
从「对象仓库」中拖入3个「View Controller」用于绘制其他设计样稿中的界面。
分别绘制相应的界面。
ps:为了简单起见,在录入具体金额时,使用系统自带的键盘。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)