IOS開發之UI佈局

来源:http://www.cnblogs.com/goodboy-heyang/archive/2016/04/04/5351303.html
-Advertisement-
Play Games

前言:本篇隨筆會經常更新,隨著本人對佈局的深入學習,會不斷補充新的知識、新的使用技巧、新的認識等等。 1、Autoresizing(在代碼中使用) 先簡單的看看下麵的代碼,以及左邊運行出來的效果,然後後面就會對iPhone模擬器進行旋轉,再看看效果,然後結合代碼中的autoresizingMask屬 ...


前言:本篇隨筆會經常更新,隨著本人對佈局的深入學習,會不斷補充新的知識、新的使用技巧、新的認識等等。

 

1、Autoresizing(在代碼中使用)

先簡單的看看下麵的代碼,以及左邊運行出來的效果,然後後面就會對iPhone模擬器進行旋轉,再看看效果,然後結合代碼中的autoresizingMask屬性來體會一下:

橫屏之後,說明豎屏預設的frame(0,0,100,500)換到橫屏之後會預設在中間一些的位置,但是因為上面設置autoresizingMask屬性是左邊和上邊自動伸縮:

以上就是基本的autoresizing在代碼中的使用。

 

2、Autolayout的使用(代碼中使用)

在Autolayout之前,有Autoresizing可以做屏幕適配,但是局限性很大,有些任務根本無法完成(Autoresizing只能設置自身和父控制項之間的相對關係)。

相比之下,Autolayout的功能就比Autoresizing的功能就強大的多,它能解決任何控制項之間的關係。

 

AutoLayout的2個核心概念:

  ①約束:通過給控制項添加約束,來決定控制項的位置和尺寸。

    使用AutoLayout就需要創建約束類創建約束對象:

      NSLayoutConstraint *leftLC = [NSLayoutConstraint constrainWithItem:......];

  ②參照:在添加約束時,是依照誰來添加(可以是父控制項或者兄弟控制項)。

 

如果會使用Autolayout就可以不需要考慮Frame值了。

 

在實際開發中,如果要使用AutoLayout,要註意一個問題,有的蘋果Cocoa框架提供UIView或者自定義的UIView可能預設設置了相關Autoresizing,那麼可能會和你後面添加的AutoLayout代碼相互衝突,所以就需要下麵的代碼,將Autoresizing自動轉換為AutoLayout:

代碼實現Autolayout的步驟

    1. 利用NSLayoutConstraint類創建具體的約束對象
    2. 添加約束對象到相應的view上
    3. - (void)addConstraint:(NSLayoutConstraint *)constraint;
    4. - (void)addConstraints:(NSArray *)constraints;

   然後下麵代碼來使用AutoLayout,我們來實現下麵的效果,當然旋轉成豎屏還是要這樣的佈局哦,不然自動佈局還有啥意義:

  

在代碼實現之前,我需要補充幾個知識:

 使用自動佈局是需要遵守一些約束的規則的:

  添加約束的規則(1)

    在創建約束之後,需要將其添加到作用的view上
    在添加時要註意目標view需要遵循以下規則:
    1)對於兩個同層級view之間的約束關係,添加到它們的父view上

    
  添加約束的規則(2)
    2)對於兩個不同層級view之間的約束關係,添加到他們最近的共同父view上
    

  添加約束的規則(3)
    3)對於有層次關係的兩個view之間的約束關係,添加到層次較高的父view上
    
    在下麵展示全部的代碼中,我抽取一部分來理解上面約束添加規則的意思:

    

    接著再補充這個約束的類和創建對象的各個參數的意義:

      一個NSLayoutConstraint對象就代表一個約束。
      創建約束對象的常用方法

        
                view1 :要約束的控制項
                 attr1 :約束的類型(做怎樣的約束)
               relation :與參照控制項之間的關係
                view2 :參照的控制項
                 attr2 :約束的類型(做怎樣的約束)
              multiplier :乘數
                   c :常量

     下麵展示實現的完整代碼:

  1 - (void)viewDidLoad {
  2     [super viewDidLoad];
  3     // 1.創建藍色的view
  4     UIView *blueView = [[UIView alloc] init];
  5     blueView.backgroundColor = [UIColor blueColor];
  6     // 禁止autoresizing自動轉為autolayout的約束
  7     blueView.translatesAutoresizingMaskIntoConstraints = NO;
  8     [self.view addSubview:blueView];
  9     
 10     // 2.創建紅色的view
 11     UIView *redView = [[UIView alloc] init];
 12     redView.backgroundColor = [UIColor redColor];
 13     // 禁止autoresizing自動轉為autolayout的約束
 14     redView.translatesAutoresizingMaskIntoConstraints = NO;
 15     [self.view addSubview:redView];
 16     
 17     // 設置約束
 18     /*****藍色view的約束****/
 19     // 左邊的約束
 20     // 左邊約束
 21     NSLayoutConstraint *leftlc_b = \
 22      [NSLayoutConstraint constraintWithItem:blueView
 23                                   attribute:NSLayoutAttributeLeft
 24                                   relatedBy:NSLayoutRelationEqual
 25                                      toItem:self.view
 26                                   attribute:NSLayoutAttributeLeft
 27                                  multiplier:1.0
 28                                    constant:30];
 29     [self.view addConstraint:leftlc_b];
 30     
 31     // 底部約束
 32     NSLayoutConstraint *bottomlc_b = \
 33     [NSLayoutConstraint constraintWithItem:blueView
 34                                  attribute:NSLayoutAttributeBottom
 35                                  relatedBy:NSLayoutRelationEqual
 36                                     toItem:self.view
 37                                  attribute:NSLayoutAttributeBottom
 38                                 multiplier:1.0
 39                                   constant:-30];
 40     [self.view addConstraint:bottomlc_b];
 41     
 42     // 右邊約束
 43     NSLayoutConstraint *rightlc_b = \
 44     [NSLayoutConstraint constraintWithItem:blueView
 45                                  attribute:NSLayoutAttributeRight
 46                                  relatedBy:NSLayoutRelationEqual
 47                                     toItem:redView
 48                                  attribute:NSLayoutAttributeLeft
 49                                 multiplier:1.0
 50                                   constant:-30];
 51     [self.view addConstraint:rightlc_b];
 52     
 53     // 寬度約束
 54     NSLayoutConstraint *wlc_b = \
 55     [NSLayoutConstraint constraintWithItem:blueView
 56                                  attribute:NSLayoutAttributeWidth
 57                                  relatedBy:NSLayoutRelationEqual
 58                                     toItem:redView
 59                                  attribute:NSLayoutAttributeWidth
 60                                 multiplier:1.0
 61                                   constant:0];
 62     [self.view addConstraint:wlc_b];
 63     
 64     // 高度約束
 65     NSLayoutConstraint *hlc_b = \
 66     [NSLayoutConstraint constraintWithItem:blueView
 67                                  attribute:NSLayoutAttributeHeight
 68                                  relatedBy:NSLayoutRelationEqual
 69                                     toItem:nil
 70                                  attribute:NSLayoutAttributeNotAnAttribute
 71                                 multiplier:0.0
 72                                   constant:50];
 73     [blueView addConstraint:hlc_b];
 74 
 75      /*****紅色view的約束****/
 76     // 右邊約束
 77     NSLayoutConstraint *rightlc_r = \
 78     [NSLayoutConstraint constraintWithItem:redView
 79                                  attribute:NSLayoutAttributeRight
 80                                  relatedBy:NSLayoutRelationEqual
 81                                     toItem:self.view
 82                                  attribute:NSLayoutAttributeRight
 83                                 multiplier:1.0
 84                                   constant:-30];
 85     [self.view addConstraint:rightlc_r];
 86     
 87     // 頂部對齊
 88     NSLayoutConstraint *toplc_r = \
 89     [NSLayoutConstraint constraintWithItem:redView
 90                                  attribute:NSLayoutAttributeTop
 91                                  relatedBy:NSLayoutRelationEqual
 92                                     toItem:blueView
 93                                  attribute:NSLayoutAttributeTop
 94                                 multiplier:1.0
 95                                   constant:0];
 96     [self.view addConstraint:toplc_r];
 97     
 98     // 底部對齊
 99     NSLayoutConstraint *bottomlc_r = \
100     [NSLayoutConstraint constraintWithItem:redView
101                                  attribute:NSLayoutAttributeBottom
102                                  relatedBy:NSLayoutRelationEqual
103                                     toItem:blueView
104                                  attribute:NSLayoutAttributeBottom
105                                 multiplier:1.0
106                                   constant:0];
107     [self.view addConstraint:bottomlc_r];
108 
109 }

 

 

補充:

  

 


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

-Advertisement-
Play Games
更多相關文章
  • 同源策略 在瀏覽器的安全策略中“同源策略”非常如雷貫耳,說的是協議、功能變數名稱、埠相同則視為同源,功能變數名稱也可換成IP地址,不同源的頁面腳本不能獲取對方的數據。 要是想使用XMLHttpRequest或者常規的AJAX請求獲取另一個站點的數據,瀏覽器會告訴你“XXXX is not allowed by A ...
  • 之前說要整理這塊內容,分享給大家,工作原因,直到現在,趕上清明宅在家裡,趕緊整理出來與大家分享。 精靈圖(CSS sprite) 所謂精靈圖,其實就是把幾張圖拼成一張圖。從而在低併發的瀏覽器上達到快速傳輸並呈現內容的目的(減少請求)。 在用到這些圖片的時候,需要引用整張圖片然後設定坐標到需要的那張小 ...
  • 轉自:http://kb.cnblogs.com/page/534571/ 一直都聽說DOM很慢,要儘量少的去操作DOM,於是就想進一步去探究下為什麼大家都會這樣說,在網上學習了一些資料,這邊整理出來。 首先,DOM對象本身也是一個js對象,所以嚴格來說,並不是操作這個對象慢,而是說操作了這個對象後 ...
  • 在"setTimeout那些事兒"中,說到JavaScript是單線程。也就是同一時間只能做同一事情。 也好理解,作為瀏覽器腳本語言,如果JavaScript不是單線程,那麼就有點棘手了。比如,與用戶交互或者對DOM進行操作時,在一個線程上修改某個DOM,另外的線程刪除DOM,這時瀏覽器該如何抉擇呢 ...
  • AngularJS $scope裡面的$watch(),$digest()和$apply()是AngularJS的核心函數,學習AngularJS必須理解這幾個函數。 在綁定$scope中的變數到view的時候,AngularJS自動在內部創建一個"Watch"。"Watch"用於監聽Angular ...
  • <a>元素的作用是可以創建一個鏈接,鏈接對應4個狀態:未訪問,已訪問,滑鼠懸停,滑鼠點擊瞬間。 為了給鏈接的4個狀態應用樣式,引入偽類的概念。 什麼是偽類呢?簡單點說,就是你沒定義這個類,但它確實作為一個類來使用。(這些類確實存在,瀏覽器在後臺會向這些類增加和刪除元素) 我在看《CSS設計指南》時, ...
  • 我們知道無論什麼時候只要創建了一個函數,就會為該函數創建一個prototype屬性,這個屬性指向函數的原型對象,預設情況下所有原型對象都會自動獲得一個constructor(構造函數)屬性,這個屬性包含了一個指向prototype屬性所在函數的指針。當調用構造函數創建一個新實例後,該實例內部就會包含 ...
  • 三欄式佈局是眾多網頁的常規佈局之一,我們在採用三欄式佈局時所提出的要求一般是左欄與右欄定寬,中間部分寬度自適應,中間部分作為內容主體,我們需要將其放在左欄與右欄之前來達到優先渲染的效果。 2006年Matthew Levine在《A LIST APART》上發表了一篇名為 "《In Search o ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...