IOS之UI异步刷新
NSOperationQueue *operationQueue; // for rendering pages on second thread
[operationQueue waitUntilAllOperationsAreFinished];
一句很简单的代码,可以实现UI的异步操作,知道操作完成,才进行进一步刷新。
NSOperationQueue是一个Operation执行队列,你可以将任何你想要执行的Operation添加到Operation Queue中,以在队列中执行。同时Operation和Operation Queue提供了很多可配置选项。Operation Queue的实现中,创建了一个或多个可管理的线程,为队列中的Operation提供可高度自定的执行环境。
DemoCode如下:
// Don't change font feature settings until all secondary thread operations are done
[operationQueue waitUntilAllOperationsAreFinished];
// Set up our font feature bitfield for given optionName
ASDFeaturesBits optionBitSelected = 0;
if (([optionName rangeOfString:ASD_SMALL_CAPITALS]).length > 0 ) {
optionBitSelected = ASDFeaturesSmallCaps;
}
else if (([optionName rangeOfString:ASD_RARE_LIGATURES]).length > 0 ) {
optionBitSelected = ASDFeaturesLigatures;
}
else if (([optionName rangeOfString:ASD_PROP_NUMBERS]).length > 0 ) {
optionBitSelected = ASDFeaturesPropNumbers;
}
else if (([optionName rangeOfString:ASD_STYLISTIC_VARS]).length > 0 ) {
optionBitSelected = ASDFeaturesStylisticVariants;
}
if (optionBitSelected && ((optionBitSelected & ASDFeaturesFeatureMask) != 0)) {
// Font features are most of the time exclusive so for simplicity we allow one feature at a time
viewOptions &= ~ASDFeaturesFeatureMask;
viewOptions |= optionBitSelected;
}
else {
// Passing @"" as the option is used to turn off all options
if ([optionName length] == 0) {
viewOptions = 0;
} else {
viewOptions ^= optionBitSelected;
}
}
if (pageViews[currCoreTextView].selectedFrame == NSUIntegerMax) {
// No selected frame, apply font features to all doc text
NSRange range = NSMakeRange(0, [document.attributedString length]);
[document setFontFeatures:(viewOptions & CoreTextViewOptionsFeatureMask) range:range];
[self relayoutDocFromPage:pageDisplayed];
}
else {
// Apply font features to selected frame
// (note that this only applies for "text" type frames)
CoreTextViewPageInfo* page = [pagesInfo objectForKey:[NSNumber numberWithInt:pageDisplayed]];
CoreTextViewFrameInfo* frame = [page.framesToDraw objectAtIndex:pageViews[currCoreTextView].selectedFrame];
if (frame.frameType == ASDFrameTypeTextFlow) {
[document setFontFeatures:(viewOptions & CoreTextViewOptionsFeatureMask) range:frame.stringRange];
[self relayoutDocFromPage:pageDisplayed];
}
else if (frame.frameType == ASDFrameTypeText) {
ApplyFontFeaturesToString(frame.value, frame.stringRange, (viewOptions & CoreTextViewOptionsFeatureMask));
[frame refreshTextFrame];
[self refreshPage];
}
}
IOS之UI异步刷新的更多相关文章
- iOS之UI组件整理
作者:神兽gcc 授权本站转载. 最近把iOS里的UI组件重新整理了一遍,简单来看一下常用的组件以及它们的实现.其实现在这些组件都可以通过Storyboard很快的生成,只是要向这些组件能够变得生动起 ...
- iOS开发UI篇—CAlayer(自定义layer)
iOS开发UI篇—CAlayer(自定义layer) 一.第一种方式 1.简单说明 以前想要在view中画东西,需要自定义view,创建一个类与之关联,让这个类继承自UIView,然后重写它的Draw ...
- iOS开发UI篇—UITabBarController简单介绍
iOS开发UI篇—UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...
- iOS开发-UI 从入门到精通(三)
iOS开发-UI 从入门到精通(三)是对 iOS开发-UI 从入门到精通(一)知识点的综合练习,搭建一个简单地登陆界面,增强实战经验,为以后做开发打下坚实的基础! ※在这里我们还要强调一下,开发环境和 ...
- iOS开发-UI 从入门到精通(二)
iOS开发-UI 从入门到精通(二)是对 iOS开发-UI 从入门到精通(一)知识点的巩固,主要以习题练习为主,增强实战经验,为以后做开发打下坚实的基础! ※开发环境和注意事项: 1.前期iOS-UI ...
- iOS开发UI篇—懒加载
iOS开发UI篇—懒加载 1.懒加载基本 懒加载——也称为延迟加载,即在需要的时候才加载(效率低,占用内存小).所谓懒加载,写的是其get方法. 注意:如果是懒加载的话则一定要注意先判断是否已经有了, ...
- iOS开发UI篇—CAlayer层的属性
iOS开发UI篇—CAlayer层的属性 一.position和anchorPoint 1.简单介绍 CALayer有2个非常重要的属性:position和anchorPoint @property ...
- iOS开发UI篇—CAlayer(创建图层)
iOS开发UI篇—CAlayer(创建图层) 一.添加一个图层 添加图层的步骤: 1.创建layer 2.设置layer的属性(设置了颜色,bounds才能显示出来) 3.将layer添加到界面上(控 ...
- iOS开发UI篇—CALayer简介
iOS开发UI篇—CALayer简介 一.简单介绍 在iOS中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. 其实 ...
随机推荐
- json数组对象和对象数组 ---OK
一.Json的简单介绍 从结构上看,所有的数据最终都可以分成三种类型: 第一种类型是scalar(标量),也就是一个单独的string(字符串)或数字(numbers),比如“北京”这个单独的词. 第 ...
- @Autowired注解和启动自动扫描的三种方式(spring bean配置自动扫描功能的三种方式)
前言: @Autowired注解代码定义 @Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, Elemen ...
- hibernate 学习 五 hibernate核心接口
一 Configuration接口 Configuration对象只存在于系统的初始化阶段.配置相关. 配置文件可以使用默认的路径,也可以指定路径. Configuration config = ne ...
- Android开发---开发文档翻译
2014.11.24 1:ClipData类:用于表示剪切的数据,此剪切的数据可以是复杂类型,包括一个或多个条目实例 (1)基础知识 >公共类:public class >嵌套类:Clip ...
- c语言中#和##的用法
一.一般用法 我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起. 用法: #include<cstdio> #include<climits> using nam ...
- Flutter实战视频-移动电商-49.详细页_Stack制作底部工具栏
49.详细页_Stack制作底部工具栏 一直悬浮在最下面的 Stack层叠组件.里面用Row 可以横向布局 开始 stack如果想定位就要用position去定位. 修改return返回值的这个地方 ...
- oracle创建用户空间、导出、导入dmp备份文件方法
导入数据需要注意的事项 1.创建一个用户对应一个表空间. 2.创建的用户和表空间一定要与bmp文件的用户和表空间一致. 3.导入的命令是在CMD下输入的 不是在SQL plus输入的. 4.可以用PL ...
- Golang : flag 包简介
在 Golang 程序中有很多种方法来处理命令行参数.简单的情况下可以不使用任何库,直接处理 os.Args:其实 Golang 的标准库提供了 flag 包来处理命令行参数:还有第三方提供的处理命令 ...
- 一张图入门git系列
github地址:https://github.com/521xueweihan/git-tips
- 强大的在线web编辑器UEditor
UEditor是由百度web前端研发部开发所见即所得富文本web编辑器,具有轻量,可定制,注重用户体验等特点,开源基于MIT协议,允许自由使用和修改代码. UEditor在线演示地址:http://u ...