<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jjgod / blog &#187; TextEdit</title>
	<atom:link href="http://blog.jjgod.org/tag/textedit/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.jjgod.org</link>
	<description>Random notes &#38; thoughts by Jiang Jiang.</description>
	<lastBuildDate>Mon, 16 Jan 2012 11:08:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>TextEdit/UCD R5 与 Cocoa Text System</title>
		<link>http://blog.jjgod.org/2008/02/18/textedit-and-cocoa/</link>
		<comments>http://blog.jjgod.org/2008/02/18/textedit-and-cocoa/#comments</comments>
		<pubDate>Mon, 18 Feb 2008 10:38:13 +0000</pubDate>
		<dc:creator>jjgod</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[cocoa]]></category>
		<category><![CDATA[TextEdit]]></category>

		<guid isPermaLink="false">http://blog.jjgod.org/2008/02/18/textedit-and-cocoa/</guid>
		<description><![CDATA[更新: TextEdit/UCD 的代码现在可以在 http://gitorious.org/projects/textedit-ucd/ 找到。 TextEdit/UCD 的第 5 个版本发布了，TextEdit/UCD 开发的目标是尽可能解决所有 TextEdit 固有的中文处理问题，但并不改变 TextEdit 原有的轻量小巧。 在开发这个版本中，我发现了一个 Cocoa Text System 的固有问题：还没有下载的朋友可以先打开自己机器上的 TextEdit，输入一个汉字，一个英文字母，如“中a”，这时汉字会以默认的中文字体显示，英文字母会以 Preferences 中设定的 Plain Text 字体 (如 Monaco) 显示，此时按下 cmd-&#8217;+&#8217; 增大一号字体，然后再输入一个英文字母，就会发现这个新的英文字母居然改用中文字体显示了？ 为什么呢？在 TextEdit 中花了一段时间重载各个类，加上 gdb 分析，结果发现，其实在 Make Text Bigger/Make Text Smaller 时，调用 [NSFontManager modifyFont:]，这个 modifyFont: 方法会将 -changeFont: 这个 action 发送到 responder chain 中，而此时的 NSTextView 收到这个 action [...]]]></description>
			<content:encoded><![CDATA[<p>更新: TextEdit/UCD 的代码现在可以在 <a href="http://gitorious.org/projects/textedit-ucd/">http://gitorious.org/projects/textedit-ucd/</a> 找到。</p>

<p>TextEdit/UCD 的第 5 个版本<a href="http://jjgod.org/program/TextEdit-UCD-r5.dmg">发布</a>了，TextEdit/UCD 开发的目标是尽可能解决所有 TextEdit 固有的中文处理问题，但并不改变 TextEdit 原有的轻量小巧。</p>

<p>在开发这个版本中，我发现了一个 Cocoa Text System 的固有问题：还没有下载的朋友可以先打开自己机器上的 TextEdit，输入一个汉字，一个英文字母，如“中a”，这时汉字会以默认的中文字体显示，英文字母会以 Preferences 中设定的 Plain Text 字体 (如 Monaco) 显示，此时按下 cmd-&#8217;+&#8217; 增大一号字体，然后再输入一个英文字母，就会发现这个新的英文字母居然改用中文字体显示了？</p>

<p>为什么呢？在 TextEdit 中花了一段时间重载各个类，加上 gdb 分析，结果发现，其实在 Make Text Bigger/Make Text Smaller 时，调用 <code>[NSFontManager modifyFont:]</code>，这个 <code>modifyFont:</code> 方法会将 <code>-changeFont:</code> 这个 action 发送到 responder chain 中，而此时的 NSTextView 收到这个 action 以后，居然会将 <code>[NSFontManager sharedInstance]</code> 的 <code>selectedFont</code> 修改为这个 TextView 的 TextStorage 中第一个字符使用的字体。于是就导致了已选字体的变化。这其实不是我们期望的结果。</p>

<p>然而，由于事实上 NSTextView 的 changeFont 实现可能很复杂，它要逐个分析所有的 run，逐个将这个 run 的字体送到 NSFontManager 中 convertFont 获得新的字体。既然我们无法直接修改这个 changeFont 的代码，就只能用重载的方法，写一个新的 NSTextView 的子类，重载这个函数，在调用基类的 changeFont 之前，先给整个文档的开头加上一个用纯文本字体的新字符，然后在调用完基类 changeFont 之后再把它删除。</p>

<p>这是一个看起来有些 dirty 的方法，不过很有用，也算是“曲线救国”，用欺骗的方式使之有正确的效果。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jjgod.org/2008/02/18/textedit-and-cocoa/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>

