iOS文本布局探讨之一——文本布局框架TextKit浅析 一、引言 在iOS开发中,处理文本的视图控件主要有4中,UILabel,UITextField,UITextView和UIWebView...其中UILabel与UITextField相对简单,UITextView是功能完备的文本布局展示类,通过它可以进行复杂的富文本布局,UIWebView主要用来加载网页或者pdf文件,其可以进行HTML,...TextKit是一个偏上层的开发框架,在iOS7以上可用,使用它开发者可以方便灵活处理复杂的文本布局,满足开发中对文本布局的各种复杂需求。...二、TextKit框架的结构 界面在进行文本的渲染时,有下面几个必要条件: 1.要渲染展示的内容。 2.将内容渲染在某个视图上。 3.内容渲染在视图上的尺寸位置和形状。...越接近1 则使用连字符进行单词换行中断的概率越大 */ @property(NS_NONATOMIC_IOSONLY) CGFloat hyphenationFactor; //是否使用字体定义的行距
iOS文本布局探讨之三——使用TextKit框架进行富文本布局 一、引言 关于图文混排,其实以前的博客已经讨论很多,在实际开发中,经常使用第三方的框架来完成排版的需求,其中RCLabel...二、原生UILabel真的只能渲染文字么? CoreText是一个比较底层且十分强大的文本渲染框架,但是其使用起来并不是十分方便。在较低版本的iOS系统中,要进行富文本排版十分困难。...在iOS6中,系统为UILabel,UITextView等这类文本渲染控件引入了NSAttributedString属性,有了NSAttributedString这个类,创建灵活多彩的文本控件变得十分轻松...三、为富文本附件添加用户交互能力 TextKit框架强大到只使用UILabel就可以完成复杂的富文本布局,但是UILabel有一个致命的缺陷,其无法进行用户交互。...) NSFileWrapper *fileWrapper; 结合UITextView可以为NSAttributedString属性字符串添加超链接,在代码回调中监听此超链接的回调可以获取NSTextAttachment
前言 iOS开发中,UITextField和UITextView是最常用的文本接受类和文本展示类的控件。UITextField和UITextView都输入文本,也都可以监听文本的改变。...而开发中,我们经常会遇到既要占位文字,又要可以多行展示并且可以滚动的控件,单纯的UITextField或者UITextView都不能满足这种产品上的需求。...子控件,作为placeholder 3.在文本改变的代理方法里面显示/隐藏UILabel 特点:该方法同样也可以实现类似于placeholder的功能。...setNeedsDisplay]; } - (void)setText:(NSString *)text { [super setText:text]; if (text.length) { // 因为是在文本改变的代理方法中判断是否显示...placeholder,而通过代码设置text的方式又不会调用文本改变的代理方法,所以再此根据text是否不为空判断是否显示placeholder。
在使用中通过将AttributedString赋值给控件的 attributedText 属性来添加文字样式。 可设置的控件有UILabel、UITextField和UITextView。.../* 注:NSLigatureAttributeName设置连体属性,取值为NSNumber对象(整数),1表示使用默认的连体字符,0表示不使用,2表示使用所有连体符号(iOS不支持2)。...NSVerticalGlyphFormAttributeName 设置文字排版方向 取值为NSNumber对象(整数),0表示横排文本,1表示竖排文本 在iOS中只支持0 */ NSString...属性单独列出来,是因为在 UILabel 和 UITextField 中是无法使用该属性的。...更准确点说是在UILabel 和 UITextField 中无法实现点击链接启动浏览器打开一个URL地址,因为在此过程中用到了一个代理函数。只能用在 UITextView 中。
大家好,又见面了,我是全栈君 BK项目已完成7788,在项目的后期需要被翻译成多国语言版。为了适应全球多个国家使用多个存储。...应用本地化是分别对字符串、图片和 xib 或 storyboard 文件本地化,而传统的做法是对 xib 上的字符串(包含UILabel和UIButton、UITextField等)关联一个变量,通过NSLocalizedString...这个函数去查找 Localizeable .strings 文件里的key值进行本地化操作,或者是生成同一个xib文件的不同语言版本号。...这样做的目的是为了尽早发现问题。 (2)冻结UI 在应用开发的周期中必需要有一个明白的时间点来冻结UI。在此之后要坚决杜绝会影响本地化的资源变更。nib 文件能够在XCode中锁定。...在不同的语言中可能会有不同。 3、注意数字和日期的格式化(输入和输出都须要进行格式化)。
它良好的结合了 UIKit 和 Core Graphics/Quartz: UIKit 的 UILabel 允许你通过在 IB 中简单的拖曳添加文本,但你不能改变文本的颜色和其中的单词。...通常你需要创建NSTextStorage的子类来在文本改变时进行文本显示样式的更新。...5、对于每一行,布局管理器必须考虑断行行为(放不下的单词必须移到下一行)、连字符、内联的图像附件等等。...4、NSTextContainer NSTextContainer描述了文本在屏幕上显示时的几何区域,每个text container与一个具体的UITextView相关联。...5、UITextView UITextView作为显示出来的实际的文本视图,在 TextKit 中,文本视图有两个目的:第一,它是文本系统用来绘制的视图。
那么AutoLayout怎么使用呢? ? VFL VFL(Virsual Format Language)是一种虚拟的格式化语言,主要用来创建AutoLayout的约束字符串。...案例3 某个View距离在父View的左侧20 案例2中白色View 上20 宽高和Demo2中的宽高一样。 ? 然后,点击某个约束。 ? 对其处理 ?...:对齐容器中的竖向中心 案例4 某个View距离在父View的右侧20 案例3中白色View上20 宽高和案例3中的宽高一样 并且对齐。...接着创建一个UITableViewCell的子类,命名为C1类。然后在C1.xib中,将与C1类进行关联。只需要在Class那里写入关联的类名C1即可。 ?...接着我们在UITableView中来使用我们自定义的UITableViewCell C1。
除了使用storyBoard进行布局约束的拖拽,有时我们也需要在代码中进行autolayout的布局设置,Masonry库可以方便的创建约束属性,实际上,我们也没有必要再使用系统原生的代码来创建和设置约束...创建NSLayoutConstraint对象的方法有两种,下面我们分别介绍: 1、使用Objective-C风格的方法创建约束对象 所谓Objective-C风格的方法,就是通过原生枚举和一些属性设置来创建... NSLayoutAttributeLeading,//起始边,类似左,只在某些从右向左排列的语言中和NSLayoutAttributeLeft有大区别 NSLayoutAttributeTrailing...2.使用ASCLL字符创造艺术般的格式化字符串约束 看到这个小标题是不是眼前一亮,这个标题不是我凭空想象出来的,apple的文档上就是这么写的。十分可爱,对吧。...VFL语言我个人而言,他很类似于古代的象形文字(不知道是否apple的工程师从其中得到灵感),对布局的约束设置是直观的用符号表达出来的,例如: H:|-20-[label(100@1000)] 前面的H
UIButton 就是这种控件; -- 静态控件 : 继承了 UIView 基类, 该类控件与用户之间不能交互, 之前使用的 UILabel 就是这种控件; -- 被动控件 : 该类控件可以接受用户操作...; -- 高亮 : UI 控件突出显示, 处于高亮状态; 手放在按钮上处于高亮状态; -- 禁用 : UI 控件关闭后, 处于禁用状态; 禁用状态的控件不可操作, 禁用操作在 Interface Builder...文本 和 图片 共同作为按钮背景, 比使用 Image 属性设置图片 显示内容 更丰富; (8) Shadow Offset 属性 Shadow Offset 属性 : -- 偏移值 : 控制 UILabel...UITextField 属性 (1) PlaceHolder 属性 PlaceHolder 属性 : 属性值是一个字符串, 再文本框没有输入内容时, 文本框内显示的灰色文本, 用于作为文本框提示信息...: 勾选该复选框可以确保整个文本在文本框总是可见; Min Font Size 属性 : -- 作用 : 指定文本框内文本的最小值, 保证文本框内文本不会因为太小而看不见; (5) Capitalization
至于编辑页面的实现,首先是创建UITableView,tableView上的Cell使用了自定义的Cell,Cell的子视图主要是一个UITextView(用于编辑内容)、UILabel(标题)、UIButton...难点:获取UITextView中的文字 (相对于直接创建五个UITextView获取它们的text较难) 解决难点: 在创建单元格的时候为每一个单元格中的UITextView设置代理,且代理为当前视图...情况2:五个条目有的有编辑内容,有的没有编辑内容,这时需要进行处理(我好像又搞复杂了,我是将五个字符串添加到了一个数组中,将数组直接传递给预览页面)。...如果没有编辑内容那么某个text字符串就是nil,nil是不能被添加到数组中的,这是需要将为nil的字符串设置为@“”。在预览页面,如果数组中某个元素内容为@“”那么就不显示该内容。...Cell,还是比较笨的做法 ) 在预览方法中取出所有的Cell,如果Cell中的按钮被选中了就将其对应的字符串设置为@“”,代码: for (StandardCell * cell in self.tableArr
至少在storyboard中创建时会喜欢。 在代码中纯手工创建约束灰常痛苦,但幸运的是我们有了SnapKit,在board中用上它,你可以简单直观地编写约束了。...Cartography - Cartography 是用来声明 Swift 中的 Auto Layout,无需输入任何 stringly 就可设置自己 Auto Layout 的约束声明。...第二个Demo模拟了一个经典的FlowLayout,任意一个元素隐藏时,底下的元素需要自动“顶”上来,配合这个扩展,你可以在IB里连一连,选一选,不用一行代码就能搞定。...TTTAttributedLabel - 一个文字视图开源组件,是UILabel的替代元件,可以以简单的方式展现渲染的属性字符串。...FXLabel - FXLabel是一个功能强大使用简单的类库,通过提供一个子类改进了标准的UILabel组件,为字体增加了阴影、内阴影和渐变色等,可以被用在任何标准的UILabel中。
而NSMutableAttributedString有可以最自己内容作出颜色以及大小的调整,这样结合起来使用的话,就远比UILabel 灵活的多,效果也酷炫的多,也许CATextLayer就是为了NSMutableAttributedString...[self.view.layer addSublayer:lary]; /* @property CGFloat contentsScale; 使用CATextLayer设置文本,可能会产生模糊状态,...在使用中通过将AttributedString赋值给控件的 attributedText 属性来添加文字样式。有属性的控件有UILabel、UITextField和UITextView。...,我想你一定用不到它 - - //NSVerticalGlyphFormAttributeName 水平或者竖直文本 1竖直 0水平 在iOS没卵用,不支持竖版 2.设置段落样式:段落样式中允许你设置文字与文字之间的行间距...、字符间距、以及对齐模式,但是注意的是,在设置段落样式的时候,必须保证控件的 numberofline属性必须为0 NSMutableAttributedString* str2 = [[NSMutableAttributedString
中的cell当有键盘弹出的时候表单整体会自动进行上移,我们需要编辑的区域正好可以在键盘的上方,这样我们正好也可以看到我们编辑的内容,方便我们进行修改和调整具体内容。 ...下面的流程就是UITextField或UITextView在整个编辑过程中的详细流程步骤: 在成为第一响应者之前,文本框调用其代理的textFieldShouldBeginEditing: 方法来允许或阻止其第一响应者... 我们在对tableview的上移进行调整时,我们需要知道当前编辑的cell相对屏幕的位置,然后才能判断是否需要上移tableview以及上移多少。... 在前面的2.1的UITextField或UITextView点击之后的详细流程分析中我们知道,在点击文本之后弹出键盘时会发送一个UIKeyboardWillShowNotification的通知,...那么,首先我们需要对对应的通知进行注册,然后设置在监听到对应的通知之后应该采取的行动和措施。
、调用这个方法的view2、view2的所有子view都会调用layoutSubviews setFrame:只有在view设置frame且尺寸参数有不同的情况下调用 滑动UIScrollView时,scrollView...首先可以上这个网站:http://iosfonts.com/查看自己要用的字体是否支持粗体,然后使用下面方法 -(void)boldFontForLabel:(UILabel *)label{...reference 把touch事件传递给子View 涉及到事件传递部分内容,另外再开博客记录 reference ---- UILabel UILabel设置行间距 reference NSMutableAttributedString...& UITextField keyboard强行关闭 [view endEditing:YES]; UITextView限制输入字符 - (BOOL)textView:(nonnull UITextView...有对应的回调,UITextField就没有。
Text View是用来显示文本内容的控件,主要包括UILabel、UITextView和UITextField。 Text containers对应着NSTextContainer类。...该类负责对文字进行编辑排版处理——通过将存储在NSTextStorage中的数据转换为可以在视图控件中显示的文本内容,并把统一的字符编码映射到对应的字形(glyphs)上,然后将字形排版到NSTextContainer...该类定义了Text Kit扩展文本处理系统中的基本存储机制。NSTextStorage继承自NSmutableAttributedString,主要用来存储文本的字符和相关属性。...另外,当NSTextStorage中的字符或属性发生了改变,会通知NSLayoutManager,进而做到文本内容的显示更新。...然后通过一个管理者(NSLayoutManager)把文字显示在容器中,形成一个我们看到的UILable。
(nonatomic,copy) NSString *text; textView上的文本 @property(nonatomic,retain) UIFont *font; 设置文本字体 @property...*typingAttributes; 设置属性字符串文本属性字典 - (void)scrollRangeToVisible:(NSRange)range; 滚动textView使其显示在本一段文本 @...中的方法 - (BOOL)textViewShouldBeginEditing:(UITextView *)textView; 是否开始编辑 - (BOOL)textViewShouldEndEditing...:(UITextView *)textView; 字符内容改变触发的方法 - (void)textViewDidChangeSelection:(UITextView *)textView; 选中内容改变触发的方法...; 当文本中的URL进行链接时触发的方法 专注技术,热爱生活,交流技术,也做朋友。
在今天的教程里面,我会教你怎样创建一个使用Speech Kit来进行语音转文字的类似Siri的app。...接下来,到 Main.storyboard 中添加一个 UILabel,一个 UITextView, 和一个 UIButton,你的storyboard应该看起来如下图: ?...接下来在 ViewController.swift文件中为UITextView 和UIButton 定义outlet变量。...所有的语音数据都会被传递到苹果的后台进行处理。因此,获取用户授权是强制必须的。 让我们在 viewDidLoad 方法里授权语音识别。用户必须允许app使用话筒和语音识别。...总结 在这个教程中,你学习到了怎样好好的利用苹果公司开放给开发者的惊人的新语言API,用于语音识别并且转换到文本。Speech framework 使用了跟Siri相同的语音识别框架。
但是我们仍然需要设置代理、实现代理,然后写上一堆的判断逻辑,总是有一些奇奇怪怪的问题导致最终结果不能很快完美呈现。...resultStr 判断是否包含非法字符,是否超长(可使用正则表达式处理) ...... } 这种方式就是在文本绘制之前会走的代理方法,我们可以在里面将非法字符扼杀在摇篮中。...在这里限制了非法字符:比如在该代理方法限制空格为非法字符,那么在输入到jian s的时候,就会出现点击无反应,因为此时已经有非法字符出现,文本不允许录入。...(解决方法在github里面有讲,只是在对应方法调用一下框架方法就行了) UITextView不能使用该方案 其实,采用这种处理办法可能会带来某些隐患。...在UITextView中,没有使用这种方法。
市面上的表情键盘的分析 首先来看一下市面上主要的几个APP上的表情键盘,平时使用的时候不会去关注细节,这次特意去使用了表情键盘,发现各个APP的体验还是有优有劣的。...首先是QQ和微信,这两者差不多,切换到表情键盘的时候都是没有光标的,这样的用户体验是非常不好的,没有办法在输入表情的时候框选区域,也不能拖动光标进行特定位置的复制黏贴删除等操作,微信甚至在输入框里显示的都不是点击的表情图片...在iOS11上,UITextView上的NSTextAttachment(表情)默认可以进行拖拽交互,但是却导致拖动光标时很容易触发这个交互(图示可以查看上面说到的微博国际版中的误触)。...} 与服务的的交互 我们在输入框中输入的内容与服务端进行交互的时候都是用纯文本的,比如会把 "笑死了?"...就会从4个字符变成1个字符,这里是有差值的,如果不处理的话就会出现上面提到的微博国际版中复制黏贴输入框的表情会导致光标位置不对,甚至莫名其妙多出前后空格的问题。
文本渲染 屏幕上能看到的所有文本内容控件,包括 UIWebView,在底层都是通过 CoreText 排版、绘制为 Bitmap 显示的。...常见的文本控件 (UILabel、UITextView 等),其排版和绘制都是在主线程进行的,当显示大量文本时,CPU 的压力会非常大。...在 Twitter Demo 中,我为了图省事儿用到了不少 layer 的圆角属性,你可以在低性能的设备(比如 iPad 3)上快速滑动一下这个列表,能感受到虽然列表并没有较大的卡顿,但是整体的平均帧数降了下来...我的做法是尽量快速、提前判断当前绘制任务是否已经被取消;在绘制每一行文本前,我都会调用 isCancelled() 来进行判断,保证被取消的任务能及时退出,不至于影响后续操作。...(- -太吊了)在显示简单的单张图片时,利用 UIView.layer.contents 就足够了,没必要使用 UIImageView 带来额外的资源消耗,为此我在 CALayer 上添加了 setImageWithURL