Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Retina Mac
Search
Weizhong Yang
August 26, 2012
Technology
270
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Retina Mac
Weizhong Yang
August 26, 2012
More Decks by Weizhong Yang
See All by Weizhong Yang
導入 Flutter 前你應該知道的事
zonble
7
1.3k
那些年,被蘋果 Ban 掉的 API
zonble
0
150
為視障朋友打造行動應用
zonble
16
1.3k
Aspect Oriented Programming
zonble
2
250
Mac OS X 與 iOS 的 Audio API
zonble
11
1k
大家來寫貪食蛇
zonble
7
4.5k
Debug Debug
zonble
6
440
HTML 5 Native Drag
zonble
3
550
Other Decks in Technology
See All in Technology
Bits AI を制するものは Datadog を制す / The player that controls Bits AI, controls Datadog
kaminashi
0
140
私がブラウザを自作したくなった理由
supurazako
1
270
My broken English still works: speaking at global OSS events
naruoga
0
120
Model Studio CLI × Token Plan
maigo999
0
200
猫付きpingコマンドを自作
uyuki234
0
270
形式手法特論:Hyperproperty とモデル検査 #kernelvm / Kernel VM Study Tokyo 19th
ytaka23
0
240
Eight Engineering Unit 紹介資料
sansan33
PRO
3
8.2k
平文パスワードはログに“残り” ── 肝心の侵入は“痕跡すら残らない”
kuroneko13
0
110
社内の7割が使うデータ基盤を、 データチーム2人で回すためにやったこと
koh_yoshi
4
1.5k
Adding Right-to-Left support to your web application with CSS logical properties — Lessons from Redmine
vividtone
0
160
ホームラボ紹介
y_sera15
0
220
Head First モブプログラミング / Head First Mobprogramming
takaking22
10
12k
Featured
See All Featured
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
370
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
220
Being A Developer After 40
akosma
91
590k
Darren the Foodie - Storyboard
khoart
PRO
3
3.7k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
250
Build your cross-platform service in a week with App Engine
jlugia
234
19k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Transcript
如何⽀支援 Mac OS X 的⾼高解析度模式 楊維中 a.k.a zonble
[email protected]
Sunday,
August 26,
萬惡的根源 Sunday, August 26,
開發環境 • MacBook Pro 2012 • 沒有新機器怎麼辦? • 使⽤用模擬環境 Sunday,
August 26,
模擬環境 Sunday, August 26,
模擬環境 Sunday, August 26,
模擬環境 Quartz Debug Sunday, August 26,
模擬環境 Sunday, August 26,
模擬環境 Sunday, August 26,
Sunday, August 26,
如何⽀支援? • 使⽤用兩倍圖檔 • 改⽤用向量圖形 Sunday, August 26,
使⽤用兩倍圖檔 • 跟 iOS ⼀一樣 • 所有⽤用到的圖⽚片 的檔名加上 @2x,然後加到 應⽤用程式中
Sunday, August 26,
使⽤用向量圖 • 向量圖檔格式很 多:Adobe Illustrator、 Corel Draw、 SVG… • Mac
OS X 系統 ⽀支援的向量格 式,簡單,就是 PDF Sunday, August 26,
Core Animation • CALayer 必須要⼿手動調整屬性,才有辦 法⽀支援 Retina Display • contents
直接給 @2x 圖⽚片是沒⽤用的 • 必須⼿手動設定 contentScale Sunday, August 26,
iOS 上⾯面 • aLayer. contentsScale = [UISCreen mainScreen].scale • 反正⼀一般來說,我們的
UI 只會出現在 mainScreen 上。雖然可以外接投影機, 使⽤用另外⼀一個 UIScreen,但是⼀一般不會 有⼈人去寫這種 App Sunday, August 26,
Mac OS X • CALayer 不⼀一定會出現在哪個 Screen 裡頭, ⽽而是要由⺫⽬目前 layer
所在的 Window 決定是否 要使⽤用⾼高解析度 • 詢問 NSWindow 的 -backingScaleFactor • Window 還可以在不同 Screen (主螢幕、延 伸螢幕)之間移動 • contentsScale 需要隨時改變 • 還有…向下相容,你應該不會只⽀支援 10.7.4 以上的系統 Sunday, August 26,
改變解析度的時機 • Layer 被放到某個 Window 的時候 • 因為 Window 移動⽽而造成
Window 的 scale 改變的時候(Notification) • 以下範例是假設 rootLayer 這個物件被擺 在某個 NSView 裡頭 Sunday, August 26,
Layer 被放到某個 Window 的時候 - (void)viewDidMoveToWindow { if ([rootLayer respondsToSelector:@selector(contentsScale)])
{ // 舊版的 OS 的 CALayer 不⼀一定會有 contentsScale // 舊版的 OS 的 Window 也不⼀一定會有 backingScaleFactor… CGFloat scale = [(id)[self window] backingScaleFactor]; [(id)rootLayer setContentsScale:scale]; } } Sunday, August 26,
訂閱 Window 移動⽽而 解析度改變的通知 • 訂閱 NSWindowDidChangeBackingPropertiesN otification • 但因為舊版系統沒有,所以直接訂閱字
串 @” NSWindowDidChangeBackingPropertiesN otification” Sunday, August 26,
訂閱 Window 移動⽽而 解析度改變的通知 • 在 viewDidMoveToWindow 訂閱 • 在
removeFromSuperview 取消 • 我們先來把剛剛那段修改 contentsScale 的程式拆出來 Sunday, August 26,
拆出來的 private method - (void)_updateContentScale { if (![self window]) {
return; } if ([rootLayer respondsToSelector:@selector(contentsScale)]) { CGFloat scale = [(id)[self window] backingScaleFactor]; [(id)rootLayer setContentsScale:scale]; } } Sunday, August 26,
訂閱通知 - (void)viewDidMoveToWindow { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(scale DidChange:) name:@"NSWindowDidChangeBackingPropertiesNotification"
object:[self window]]; [self _updateContentScale]; } - (void)removeFromSuperview { [super removeFromSuperview]; [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (void)scaleDidChange:(NSNotification *)n { [self _updateContentScale]; } Sunday, August 26,
向下相容 • ⽤用舊版的 SDK 編譯,compiler 會跟你抱 怨沒有 contentsScale 與 backingScaleFactor…
很討厭 Sunday, August 26,
為了向下相容弄出來 的⻤⿁鬼 Category… @interface NSObject (RetinaDisplay) - (void)setContentsScale:(CGFloat)inScale; - (CGFloat)backingScaleFactor;
@end Sunday, August 26,
That’a all! Sunday, August 26,