iOS開發必會的坐標系探究

来源:https://www.cnblogs.com/qcloud1001/archive/2018/11/13/9953520.html
-Advertisement-
Play Games

歡迎大家前往 "騰訊雲+社區" ,獲取更多騰訊海量技術實踐乾貨哦~ 本文由 "落影" 發表於 "雲+社區專欄" 前言 app在渲染視圖時,需要在坐標系中指定繪製區域。 這個概念看似乎簡單,事實並非如此。 When an app draws something in iOS, it has to lo ...


歡迎大家前往騰訊雲+社區,獲取更多騰訊海量技術實踐乾貨哦~

本文由落影發表於雲+社區專欄

前言

app在渲染視圖時,需要在坐標系中指定繪製區域。 這個概念看似乎簡單,事實並非如此。

When an app draws something in iOS, it has to locate the drawn content in a two-dimensional space defined by a coordinate system. This notion might seem straightforward at first glance, but it isn’t.

正文

我們先從一段最簡單的代碼入手,在drawRect中顯示一個普通的UILabel; 為了方便判斷,我把整個view的背景設置成黑色:

- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];
    CGContextRef context = UIGraphicsGetCurrentContext();
    NSLog(@"CGContext default CTM matrix %@", NSStringFromCGAffineTransform(CGContextGetCTM(context)));
    UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 28)];
    testLabel.text = @"測試文本";
    testLabel.font = [UIFont systemFontOfSize:14];
    testLabel.textColor = [UIColor whiteColor];
    [testLabel.layer renderInContext:context];
}

這段代碼首先創建一個UILabel,然後設置文本,顯示到屏幕上,沒有修改坐標。 所以按照UILabel.layer預設的坐標(0, 0),在左上角進行了繪製。

imgUILabel繪製

接著,我們嘗試使用CoreText來渲染一段文本。

- (void)drawRect:(CGRect)rect {
    [super drawRect:rect];
    CGContextRef context = UIGraphicsGetCurrentContext();
    NSLog(@"CGContext default matrix %@", NSStringFromCGAffineTransform(CGContextGetCTM(context)));
    NSAttributedString *attrStr = [[NSAttributedString alloc] initWithString:@"測試文本" attributes:@{
                                                                                                  NSForegroundColorAttributeName:[UIColor whiteColor],
                                                                                                  NSFontAttributeName:[UIFont systemFontOfSize:14],
                                                                                                  }];
    CTFramesetterRef frameSetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef) attrStr); // 根據富文本創建排版類CTFramesetterRef
    UIBezierPath * bezierPath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 100, 20)];
    CTFrameRef frameRef = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), bezierPath.CGPath, NULL); // 創建排版數據
    CTFrameDraw(frameRef, context);
}

首先用NSString創建一個富文本,然後根據富文本創建CTFramesetterRef,結合CGRect生成的UIBezierPath,我們得到CTFrameRef,最終渲染到屏幕上。 但是結果與上文不一致:文字是上下顛倒。

imgCoreText的文本繪製

從這個不同的現象開始,我們來理解iOS的坐標系。

坐標系概念

在iOS中繪製圖形必須在一個二維的坐標系中進行,但在iOS系統中存在多個坐標系,常需要處理一些坐標系的轉換。 先介紹一個圖形上下文(graphics context)的概念,比如說我們常用的CGContext就是Quartz 2D的上下文。圖形上下文包含繪製所需的信息,比如顏色、線寬、字體等。用我們在Windows常用的畫圖來參考,當我們使用畫筆

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 時序資料庫InfluxDB安裝及使用 1 安裝配置 安裝 常規操作 啟停 2 重要概念 influxdb裡面有一些重要概念:database,timestamp,field key, field value, field set,tag key,tag value,tag set,measureme ...
  • Date和Timestamp精度不一樣: 01)Timestamp精確到了秒的小數點(如:2018-11-13 16:40:03.698); 02)Date只精確到整數的秒(如:2018-11-13 16:40:03) ...
  • 1 mycat介紹 中間件:代理; 面向企業的開源的大的資料庫集群,性能極高;淘寶正在使用; 1.1 資料庫中間件歷史: amoeba:變形蟲 缺點:分散式高可用結構不穩定 cobar:mycat前身 缺點:cobar容易出現後端物理伺服器的假死現象 2 資料庫中間件的原理 3 mycat特點: 1 ...
  • 近年來,大數據以迅猛的發展速度滲透進人們生活的方方面面。大數據是信息化發展的新階段,隨著信息技術和人類生產生活交匯融合,互聯網飛速普及,全球數據呈現爆發增長、海量集聚的特點,對經濟發展、社會治理、人民生活都產生了重大影響。大數據掀起了科技發展的浪潮,學習大數據的人越來越多,由之前的電腦專業逐漸像零 ...
  • 1 讀寫分離 在資料庫分散式集群中,從節點從邏輯上是不能寫數據的,但是也不讀的話會造成資源的浪費; 分析: 集群中從節點具有數據同步的效果,可以完成對外的讀服務,從節點的整體數量一般來講大於主節點;讀的服務比例大於寫的服務;一旦讀寫分離實現,集群的性能就可以得到極大的提升; 2 高可用替換 分散式數 ...
  • linux下多台mysql的安裝,主從關係的配置,實現單機熱備,雙機熱備 ...
  • SQL Server的日誌傳送(log shipping)技術一直比較雞肋,尤其當SQL Server 推出了Always On技術以後,估計使用日誌傳送(log shipping)這種技術方案的企業越來越少,但是日誌傳送也有自己的一些優點,有些特殊場景或業務背景下也有其存在的價值。最近由於特殊業務... ...
  • Intent的用法 意圖的分類和用法: 隱式意圖:通過指定一組數據或者動作實現 顯示意圖:通過指定具體的activity實現 意圖的用途: 顯示意圖用於開啟自己應用內的Activity. 隱式意圖用於開啟其他應用的Activity(主要是系統應用),相比顯示意圖安全性較差. 意圖的實現: 通過Int ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...