Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Retina Mac
Search
Weizhong Yang
August 26, 2012
Technology
290
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
170
為視障朋友打造行動應用
zonble
16
1.3k
Aspect Oriented Programming
zonble
2
260
Mac OS X 與 iOS 的 Audio API
zonble
11
1.1k
大家來寫貪食蛇
zonble
7
4.5k
Debug Debug
zonble
6
450
HTML 5 Native Drag
zonble
3
560
Other Decks in Technology
See All in Technology
セルフサービスのオブザーバビリティ基盤をOpenTelemetryで作る / Building a Self-Service Observability Platform with OpenTelemetry
ymotongpoo
3
490
Mastering Agentic Development: Harness Engineering for Effective Coding Agents
konippi
3
660
顧客の成果創出とプロダクトの成長を 両立するためのFDE
sansantech
PRO
0
520
プラットフォームを「作る」、 チームに「入り込む」
sansantech
PRO
0
400
全社共通データ基盤をつくる。ソニーのDatabricks活用とデータガバナンス設計の裏側
sony
0
260
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
16
120k
20260915deck.gl-raster を使ってみた
rena1208
0
170
OpenClawでAzure DevOpsのWiki更新を自動化する - クラウドAIだけでは届かない場所へ
yutakaosada
0
130
Snowflake Horizon Catalog と Apache Iceberg で作る オープンなデータ基盤
kitagawaz
0
350
Amazon Bedrock Agents ClassicからAmazon Bedrock AgentCoreへ移行した際、ガードレール設定が2箇所に割れた話
matsunobu
0
160
地方移住と都心キャリアの両立は「金・時間・人」のリソースをフル活用すれば実現できる!〜Snowflake女子会 vol.8
snowwmn0824
0
140
企業の現実世界をグラフで写し取る
sansantech
PRO
0
210
Featured
See All Featured
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
2
590
Prompt Engineering for Job Search
mfonobong
0
460
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
600
Fashionably flexible responsive web design (full day workshop)
malarkey
409
67k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
540
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
KATA
mclloyd
PRO
35
16k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
470
Mobile First: as difficult as doing things right
swwweet
225
10k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
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,