[Android開發學iOS系列] 快速上手UIKit

来源:https://www.cnblogs.com/mengdd/archive/2022/10/13/iOS-UIKit-quick-start.html
-Advertisement-
Play Games

快速上手iOS UIKit UIKit是蘋果官方的framework, 其中包含了各種UI組件, window和view, 事件處理, 交互, 動畫, 資源管理等基礎設施支持. 按照前面的介紹, 用UIKit寫UI可以用storyboard(Interface Builder)和代碼兩種方式. 大體 ...


快速上手iOS UIKit

UIKit是蘋果官方的framework, 其中包含了各種UI組件, window和view, 事件處理, 交互, 動畫, 資源管理等基礎設施支持.

按照前面的介紹, 用UIKit寫UI可以用storyboard(Interface Builder)和代碼兩種方式.

大體的思路都是添加組件後, 設置屬性, 設置尺寸位置約束, 處理響應事件.

這裡主要介紹用代碼寫的情形.
希望這篇文章, 可以幫你快速上手UIKit, 熟悉常用的組件, 完成一些簡單的UI界面相關任務.

在代碼中寫UI的基本步驟

在代碼中寫UI的步驟大致是:

  • 初始化.
  • addSubview添加到當前view, 或hierarchy中的其他可達view.
  • 設置約束.

比如:

class ViewController: UIViewController {
    var myLabel: UILabel!

    override func loadView() {
        view = UIView()
        view.backgroundColor = .white

		// 創建實例
        myLabel = UILabel()
        myLabel.translatesAutoresizingMaskIntoConstraints = false
        myLabel.text = "Hello"
        
        // 添加到view中
        view.addSubview(myLabel)

        // 設置約束
        NSLayoutConstraint.activate([
            myLabel.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor),
            myLabel.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor),
        ])
    }
}

這裡有幾點說明:

  • var** myLabel: UILabel! 組件欄位這樣聲明有lateinit的作用, 如果不帶!會報錯, 說controller沒有init方法.
  • 如果在代碼中設置UI組件的constraints, 那麼這個屬性經常要設置為false: translatesAutoresizingMaskIntoConstraints = **false**. 如果組件的位置是通過frame來設置的, 則不用設置這個屬性.
  • 約束有多種寫法, 這裡只是其中一種, 用anchor的方式.

常用組件

文字: UILabel

設置文字等屬性:

myLabel = UILabel()
myLabel.translatesAutoresizingMaskIntoConstraints = false
myLabel.font = UIFont.systemFont(ofSize: 24)
myLabel.text = "Hello"
myLabel.numberOfLines = 0
myLabel.textAlignment = .right

給UILabel設置點擊事件:

myLabel.isUserInteractionEnabled = true
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(userDidTapLabel(tapGestureRecognizer:)))
myLabel.addGestureRecognizer(tapGesture)

點擊事件處理方法:

@objc func userDidTapLabel(tapGestureRecognizer _: UITapGestureRecognizer) {
    print("label clicked!")
}

這裡有#selector, 對應的userDidTapLabel方法要加上@objc. 便於OC的代碼調用能找到swift的方法.

給UILabel設置點擊事件和UIButton不同, 這點我們後面說繼承關係的時候解釋一下.

按鈕: UIButton

設置文字:

submitButton = UIButton(type: .system)
submitButton.translatesAutoresizingMaskIntoConstraints = false
submitButton.titleLabel?.font = UIFont.systemFont(ofSize: 36)
submitButton.setTitle("SUBMIT", for: .normal)
submitButton.setTitleColor(.black, for: .normal)

設置點擊事件:

submitButton.addTarget(self, action: #selector(submitTapped), for: .touchUpInside)

@objc func submitTapped(_ sender: UIButton) {

}

這裡使用@objc的理由同上.

基本上我們在iOS代碼中用到#的時候, 對應的方法都要加上@objc.

輸入框: UITextField

myTextField = UITextField()
myTextField.translatesAutoresizingMaskIntoConstraints = false
myTextField.placeholder = "What's your name?"
myTextField.textAlignment = .center
myTextField.font = UIFont.systemFont(ofSize: 44)

想要禁用輸入框可以這樣:

myTextField.isUserInteractionEnabled = false

彈框

在app里簡單的交互我們經常需要彈出一個對話框:

let alert = UIAlertController(title: "title", message: "message", preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Ok", style: .default))
alert.addAction(UIAlertAction(title: "Cancel", style: .cancel))
present(alert, animated: true)

其中preferredStyle有.alert.actionSheet兩種.

.alert是中心的對話框, 一般用於信息提示或者確認操作; .actionSheet是底部的bottom sheet, 一般用來在幾個選項中做選擇.

其他

  • view中比較常用的屬性isHidden, 控制view是否需要隱藏.
  • 所有的UIView都有一個layer屬性.
    設置border的寬度和顏色就在layer上設置.
    CALayer在UIView之下. 所以不知道UIColor, 只知道CGColor.

本文僅列出幾個常用組件, 更多的請看官方示例.

這裡可以下載

繼承關係

NSObject是所有Cocoa Touch class的基類. 所有UIKit中的類都是它的子類.

這裡有一個類關係的圖:

UIKit Classes

我們這裡不展開講述所有了, 只解答一下前面提出的關於UILabel點擊事件的問題.

UIKit Classes annotated

這裡可以看到UILabelUIButton雖然都繼承了UIView, 但是UIButton的繼承層次更深一些, 它還繼承了了UIControl.

可以看到和UIButton平級的還有好幾個子類.

Controls使用的是target-action機制, 所有的action都通過方法: addTarget(_:action:for:) 添加.

約束Constraints

當在代碼中設置約束時, 有三種選擇:

  • 使用layout anchors.
  • 使用NSLayoutConstraint類.
  • 使用Visual Format Language.

上面我們提到過的就是其中Layout Anchors的寫法:

初級單個寫法:

buttonsView.topAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
buttonsView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
buttonsView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
buttonsView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true

放進數組裡批量激活寫法:

NSLayoutConstraint.activate([
            buttonsView.topAnchor.constraint(equalTo: view.centerYAnchor),
            buttonsView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            buttonsView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            buttonsView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
        ])

感覺是對新手比較直觀的一種寫法.

其他寫法文末有參考文檔.

PS: 項目中更流行用 SnapKit.

區域限制

  • safeAreaLayoutGuide : 去掉圓角和劉海.
  • layoutMarginsGuide : safe area的內部再加上一些額外的margin.

Bonus

  • 友情提示: 在xcode里就可以看官方文檔, 快捷鍵是Cmd + Shift + 0.

References

作者: 聖騎士Wind
出處: 博客園: 聖騎士Wind
Github: https://github.com/mengdd
微信公眾號: 聖騎士Wind
微信公眾號: 聖騎士Wind
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • nginx 一、nginx簡介 nginx(發音同engine x)是一款輕量級的Web伺服器/反向代理伺服器及電子郵件(IMAP/POP3)代理伺服器,併在一個BSD-like協議下發行。 nginx由俄羅斯的程式設計師Igor Sysoev所開發,最初供俄國大型的入口網站及搜尋引擎Rambler ...
  • Redis有3種實現持久化的方式:AOF日誌、RDB快照、混合持久化 Redis寫入AOF日誌的過程 Redis執行完寫操作命令後,將命令追加到server.aof_buf緩衝區 通過write()系統調用,將aof_buf緩衝區的數據寫入到AOF文件 數據被拷貝到了內核緩衝區page cache ...
  • 一、MySQL資料庫內置系統表 mysql5.7之後的版本自帶資料庫為 1.information_schema資料庫 這個庫在mysql中就是個信息資料庫,它保存著mysql伺服器所維護的所有其他資料庫的信息,包括了資料庫名,表名,欄位名等。在註入中,infromation_schema庫的作用無 ...
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 文章導讀: 什麼是Undo Log? Undo:意為撤銷或取消,以撤銷操作為目的,返回某個狀態的操作。 Undo Log:資料庫事務開始之前,會將要修改 ...
  • 摘要:本文重點介紹單個SQL語句持續執行慢的場景。 本文分享自華為雲社區《GaussDB(DWS) SQL性能問題案例集》,作者:黎明的風。 本文重點介紹單個SQL語句持續執行慢的場景。我們可以對執行慢的SQL進行單獨分析,SELECT、INSERT、UPDATE等語句都可以使用explain ve ...
  • 當前Nebula Graph的最新版本是3.2.1, Nebula Graph 的一些特點 1. 支持分散式. 相對於Neo4j, TigerGraph這些圖資料庫, Nebula 是面向分散式設計的, 因此對集群的支持比較完備, 在規模上上限要高很多. 在實際項目中存儲了180億的點邊, 這個數量... ...
  • 2.1關係數據結構形式化定義: 2.1.1關係: 單一的數據結構 - 關係: 現實世界的實體以及實體間的各種聯繫均用關係來表示 邏輯結構 - 二維表: 從用戶的角度,關係模型中的數據的邏輯結構是一張二維表 關係模型是建立在集合代數的基礎上 域:域是一組具有相同數據類型的值的集合 例:整數、實數、介於 ...
  • GreatSQL社區原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 GreatSQL是MySQL的國產分支版本,使用上與MySQL一致。 一、MySQL的dd表介紹 二、代碼跟蹤 三、知識應用 四、總結 一、MySQL的dd表介紹 MySQL的dd表是用來存放表結構和各種建表信息的,客戶端 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...