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
3
220
Retina Mac
Weizhong Yang
August 26, 2012
Tweet
Share
More Decks by Weizhong Yang
See All by Weizhong Yang
導入 Flutter 前你應該知道的事
zonble
7
1.2k
那些年,被蘋果 Ban 掉的 API
zonble
0
110
為視障朋友打造行動應用
zonble
16
1.3k
Aspect Oriented Programming
zonble
2
220
Mac OS X 與 iOS 的 Audio API
zonble
11
980
大家來寫貪食蛇
zonble
7
4.4k
Debug Debug
zonble
6
390
HTML 5 Native Drag
zonble
3
520
Other Decks in Technology
See All in Technology
SREのプラクティスを用いた3領域同時 マネジメントへの挑戦 〜SRE・情シス・セキュリティを統合した チーム運営術〜
coconala_engineer
2
710
セキュリティについて学ぶ会 / 2026 01 25 Takamatsu WordPress Meetup
rocketmartue
1
310
CDKで始めるTypeScript開発のススメ
tsukuboshi
1
510
[CV勉強会@関東 World Model 読み会] Orbis: Overcoming Challenges of Long-Horizon Prediction in Driving World Models (Mousakhan+, NeurIPS 2025)
abemii
0
140
20260204_Midosuji_Tech
takuyay0ne
1
160
広告の効果検証を題材にした因果推論の精度検証について
zozotech
PRO
0
210
コンテナセキュリティの最新事情 ~ 2026年版 ~
kyohmizu
2
490
Frontier Agents (Kiro autonomous agent / AWS Security Agent / AWS DevOps Agent) の紹介
msysh
3
180
22nd ACRi Webinar - NTT Kawahara-san's slide
nao_sumikawa
0
100
Oracle Cloud Observability and Management Platform - OCI 運用監視サービス概要 -
oracle4engineer
PRO
2
14k
顧客の言葉を、そのまま信じない勇気
yamatai1212
1
360
AWS Network Firewall Proxyを触ってみた
nagisa53
1
240
Featured
See All Featured
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
740
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
650
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
1.8k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.7k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
122
21k
How STYLIGHT went responsive
nonsquared
100
6k
Raft: Consensus for Rubyists
vanstee
141
7.3k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
230
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
130
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
740
GraphQLとの向き合い方2022年版
quramy
50
14k
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,