顯示具有 Objective-C 標籤的文章。 顯示所有文章
顯示具有 Objective-C 標籤的文章。 顯示所有文章

2018年6月26日 星期二

[iOS] Singleton的產生語法

有時候整個App生命週期可能需要某幾個只有一個實體的Class,

這時候可以使用Singleton來達成,以下是產生Singleton的程式碼。

Swift


Objective - C



2017年11月16日 星期四

[Objective-C] Class property - 類別屬性

XCode8以上在Objective-C增加了class關鍵字,你只需要在@property增加此關鍵字即可讓此屬性變成Class Property。

首先先在.h宣告一個class property。


接著在.m實作Getter與Setter。
這樣你就可以使用這個class property了,如果這個屬性是readonly的話,可以只實作Getter就好。

2017年11月14日 星期二

[iOS] 在專案中使用OpenSSL的方法

首先先下載OpenSSL-for-iPhone,點選Clone or Download,並下載到你的電腦裡面。

接著打開終端機,並且前往到剛才下載的資料夾內。

接著輸入此指令


./build-libssl.sh

等待安裝OpenSSL完成,當完成時,可以先打開剛才下載的專案,並且執行,若是安裝成功應該可以跑起來。

























若是成功了,你可以現在試著開啟自己的專案,並加入OpenSSL,首先先新增一個專案

接著打開剛才的資料夾,把include複製到新的專案資料夾內。














接著一樣在資料夾中,找到lib的資料夾,把libssl.a跟libcrypto.a加到新的專案中













接下來切換到Bulid Settings,搜尋Library Search Paths,並添加以下兩個參數
$(inherited)
$(SRCROOT)


接著一樣在Bulid Settings,並搜尋Header Search Paths,並且參數為include,並將改為recursive,接著上面的Always Search User Path設定為YES。

接下來,你可以把之前的資料夾內的FSOpenSSL複製到你的專案,並且跑看看,若是成功的話,那你的專案就可以使用OpenSSL了。


2017年11月13日 星期一

[iOS] 有關UITextField反白區域與游標位置

如何得知目前使用者的游標位置或者是反白區域,可以參考以下的程式碼。

Objective-C



Swift



而如果你需要改編游標位置或者是反白區域,可以參考以下的程式碼。

Objective-C



Swift


2017年11月1日 星期三

[Objective-C] Nullability

Swift有提供可選型別(Optional)來判斷該值是否能為null,而Objective-C並沒有這樣的設計,因此Xcode增加了Nullability Annotations的機制,也就是Nullable與Nonnull。

Nullable - 表示對象可為null
Nonnull - 表示對象不可為null

而一開始增加此機制時,所提供的關鍵字為__nullable/__nonnull,但是為了處理與第三方套件的衝突,蘋果又將此關鍵字改為_Nullable/_Nonnull,以及沒有底線版本的nonnull/nullable,基本上這三種東西都是同樣的效果,只是放的位置不同而已。

小寫版本的__nullable/__nonnull,應該比較少用了,絕大部分還使用_Nullable/_Nonnull與沒有底線的nonnull/nullable。

那麼有底線跟沒底線的是什麼情景會用到呢,可以參考以下的程式碼


有底線的則是用於Block內傳入的參數或回傳的參數。


接著你只要在呼叫的時候傳入nil,Xcode就會發出警告。


不過若是每個都要設定成不能Nonnull實在有點麻煩,因此有提供Macro,只要輸入NS_ASSUME_NONNULL_BEGIN與NS_ASSUME_NONNULL_END,在這個區塊內所有的東西就會自動判定為Nonnull,你只需要定義出屬於Nullable的值即可。



接著你可以試著看一下是否有作用。


2017年3月10日 星期五

[Objective-C] 加入事件到手機行事曆之中

首先,你必須先在你的APP專案中設定提示訊息,若是你要存取使用者行事曆時,會顯示的訊息,而這是必要的步驟,若是沒加入此提示訊息,執行時將會有錯誤。

設定的步驟可以參考以下的圖片。


第四步驟要加入的值為Privacy - Calendars Usage Description,Value可以不填入任何資料。

此時,若是你的APP要存取行事曆時,就會跳出提示訊息提醒使用者,若使用者同意讓你存取,就可以進行存取了。

接著可以開始寫程式了,要先在import以下的東西才能使用。


初始化EKEventStore之後,執行以下的方法,並填入兩個參數。



EKEntityType可以填入以下兩個其中之一,會依照輸入的不同,而在行事曆裡面建立不同的種類

EKEntityTypeEvent(事件)
EKEntityTypeReminder(提醒)

加入事件到行事曆的可以參考以下的程式碼


實際執行時,你可以確認行事曆是否有加入剛才加入的事件



























此外,如果你想使用APP刪除此事件,可以參考以下的程式碼,透過剛才加入事件的辨識符號來刪除。


2016年9月14日 星期三

[Objective-C] 使用xib來製作客製化的View

有時候你會需要一些客製化的View,你可以繼承UIView,在使用程式碼來刻出你想要的樣子。

但是實在不夠直覺,你可以試著使用xib來達成這個需求。

首先我們先創建一個繼承自UIView的檔案,名為MyView。

接著我們也創建一個名為MyView的xib檔。




















接著我們點選我們的xib檔,並選擇File's Owner,

設定Custom Class為我們的MyView













此時你可以在xib上面加入一些元件,也可以進行IBAction與IBOutlet的相關設定了。

接著,你必須到MyView.m檔裡面加入一些程式碼。

我們可以透過快速輸入來產生程式碼的架構,

我們選擇initWithCoder。





















用拖曳的形式加入到你的程式碼之中,此時你的程式碼長得像這個樣子。










接著將你的程式碼改成這個樣子



如此一來你的xibView就會在MyView載入的時候,也加入到裡面去,

這麼一來你就可以很方便的透過視覺化介面來拉屬於你的View。

最後只需要簡單的在VC上面加入一個UIView,並指定Class為MyView就可以了。


2016年8月30日 星期二

[Objective-C] 類似9-Patch圖於iOS上實作

Android裡面會使用9-Patch圖片來顯示一些圖片,

最常見的例子就是按鈕,舉例來說,類似這樣的按鈕圖片










正常來說可能只會給一張圖片,然後各裝置幾乎都是套用此圖片,因此在某些情況下,可能會有稍微失真的情況。

此時如果使用9-Patch圖,就不會有這樣的問題了。

9-Patch圖是標示頭尾,以及重複區段,頭尾顯示後,中間都已重複區段來填滿。

可能會長這個樣子,然後標示中間的部分是重複區段。







這樣就能避免失真的情況發生,但是9-Patch在iOS目前並不支援。

但是你可以使用resizableImageWithCapInsets這個方法來達到相似的效果。

你只需要像以下的程式碼就可以達成。



在實際執行時,你會看到畫面會像這個樣子。



























如此一來你也能得到類似9-Patch的效果了。

只是你要自己去量哪部分需要重複顯示,有這麼點麻煩而已。

這個範例可以在我的Github中下載

https://github.com/Aiur3908/ObjectiveC-SampleCode

裡面的ResizableImage就是了。


2016年8月19日 星期五

[Objective-C] __weak與__block與__strong的介紹

在使用block時,會看到這三個東西,這三個又是做什麼的呢?

在這邊用一些例子來做解釋。

__block

在block裡面,要存取外面的變數時,要在變數前面加上這個關鍵字。

舉例來說。



你想要在block去修改外面的變數,如果這樣寫的話會有錯誤,如果要在block裡面去修改變數,則要在前面加上__block關鍵字。



__weak與__strong

這兩個會一起做說明,你可以先創一個class,在裡面加入一個方法來做測試,

就像這樣。





此時,先做第一個實驗,在block之中去執行剛才那個class的方法,

執行block後,馬上將此物件設為nil,在執行一次block。



你會發現,明明設為nil了,在block裡面卻還會執行,因為這個block產生了循環引用的問題,那麼該怎麼解決呢,你可以加入__weak關鍵字。



此時,就可以解決循環引用的問題,在這個block裡面並不是強引用,因此當外面設為nil時,block裡面就會變空了。

這樣看起來挺美好的,但是其實還有一個問題,當你的block在執行時,外面有人將設為nil時,你會發現裡面也會變成nil。



在block裡面等五秒,然後同時,外面設為nil,五秒後你會發現並沒有執行這個方法,因為已經被設為nil了,你只要在裡面加上__strong關鍵字,在block中就會是強參考



不過要在設nil之前稍微等一下,以免還沒進去block就被設了XD。

此時你就不怕在block執行時,外面設nil會發生一些怪問題。

可是也許外面設nil,block執行時也會一起變成nil是你需要的效果,你就可以不用加入strong關鍵字。

透過這些實驗應該能稍微了解三者的差異了。

如果這篇文章有任何錯誤或者問題,歡迎提出。

2016年8月18日 星期四

[Objective-C] 取得使用者當前座標的方法

有時候會需要使用者當前的座標,該如何取得呢?

首先先拉一個簡單的顯示畫面。

















當按下GetUserCoordinates的時候,會取得使用者當前的座標。

接著你必須要加入CoreLocation這個framework。

點選專案,在General標籤最底下的Linked Frameworks And Libraries中的加號。


接著搜尋CoreLocation,並加入到你的專案之中




























接著你必須在info.plist之中,依照的你需求加入以下兩個值

永遠使用使用者的位置(包含背景)
NSLocationAlwaysUsageDescription

當開啟App時取得使用者的位置
NSLocationWhenInUseUsageDescription

當然,你也可以兩個都加。


而Value,如果有特別想顯示的文字可以輸入,當取用位置時,會顯示你所輸入的文字,提醒使用者這個App會取得你的位置了。

當然,如果不輸入任何文字,則會顯示系統預設的資訊。

在你的.h檔案中,import <CoreLocation/CoreLocation.h>,

並且增加CLLocationManagerDelegate到你的class之中。

你的.h檔案可能會像以下的樣子。



接著來實作按鈕的事件,當點下去的時候,

會先跳出請求,告知使用者要取用他的位置了,之後在開始取得。

而請求的種類也有分兩種,看你想要跳出哪種資訊。



接著,你要實作CLLocationManagerDelegate這個Protocol。



如此一來,你就可以取得使用者當前的座標了。

執行時,當按下按鈕,會跑出這個提醒訊息



























如果你的模擬器點了毫無反應,可以點選下方的箭頭符號,來切換模擬器當前的位置












如果你想要這篇文章的範例檔,可以到我的GitHub下載

https://github.com/Aiur3908/ObjectiveC-SampleCode

裡面的GetUserCoordinates就是這篇的例子

2016年8月11日 星期四

[Objective-C] 在元件中加入邊框的方法

有時候你會需要一些元件有邊框,像是特定的View或者是Button之類的。

大部分的元件都是繼承於UIView,而UIView裡面有個屬性叫做layer,我們可以利用這個layer來簡單的加入邊框。

我們加入一個Button,並且加入厚度為2的邊框,在設置邊框的顏色,你只需要這樣做。



你會得到這樣的效果



























那麼,如果你只想加特定位置的邊框該怎麼做呢?

例如有一個View,只有上下想要加入邊框。

我會建議你針對CaLayer寫一個Category,這樣你就可以在所有有繼承UIView的元件中使用了。

先創建一個Class,將名字命名為CALayer+Board。







在h檔中import UIKit,並加入以下的程式碼。



接著在m檔中,實作剛才加入的方法。



接著該怎麼用呢,你只要在你要用的類別中import你剛才實作的Category

然後再針對View的layer使用你實作的方法即可。



你會得到以下的畫面



























如果你想要這篇的程式碼,可以到我的GitHub中取得

https://github.com/Aiur3908/ObjectiveC-SampleCode

裡面的AddBorder就是這篇的例子

2016年8月8日 星期一

[Objective-C] 實作頁面切換功能

頁面切換的功能,許多地方都運用到類似的設計,舉例來說像是iPhone的首頁就有用到



























靠手指來Scroll,切換頁面,並在下方加入PageControl來提醒使用者目前位於哪個頁面,

該如何實作呢?

首先開一個專案,在UIViewController之中加入一個UIScrollView,並設定相關的Constraints,假設我希望它靠上,並且與螢幕等寬,高度為200。

你的Constraints會像以下的圖片一樣。






















接著你可能會想要有一個PageControl,也就是點點的部分,此時你要加入一個UIPageControl在你的UIViewController之中。

這裡要注意的是,不是加到UIScrollView,而是在UIViewController之中,因為你要讓這個點點浮在UIScrollView之上。

因此我們只需要設定它與上邊界間距150,以及垂直置中兩條約束即可,此時你的Constraints會像以下的圖片。




















要稍微注意一下View擺放的位置,因為PageControl要浮在UIScrollView之上,因此你的PageControl要擺在UIScrollView之後。






















這邊有一個小技巧給大家參考一下,如果你先加入了UIScrollView,此時要設定PageControl也要跟螢幕上緣作對齊的動作,你可以在尺標那邊將Y軸設定的小一些,他參考的對象就不會是UIScrollView了。











接著,設定你的IBOutlet吧,並且加入UIScrollViewDelegate這個Protocol



然後,你可以參考以下的程式碼



主要你必須先確定你的ContentSize大小,並且做設定,然後加入的頁面依照頁面的不同,在初始化時,設定Frame給予不同的座標。

到這一步你應該就有可以切換頁面的效果了,最後實作UIScrollViewDelegate裡面的
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
來完成PageControl的顯示。



接著,你要在你的PageControl的Value Changed事件加入以下的程式碼,
這樣在PageControl改變時,頁面也會跟著改變。



如此一來就完成了簡單的頁面切換功能。

相關程式碼可以到我的GitHub頁面下載

https://github.com/Aiur3908/ObjectiveC-SampleCode

裡面的InfiniteCarousel就是這篇文章的例子。

參考文章:

使用 UIPageControl 與 UIScrollView 來實作畫面切換的效果

2016年8月5日 星期五

[Objective-C] BBBadgeBarButtonItem的使用方式

如果你想要在NavigationItem上面加入一些數字符號,類似下面的圖案。












你可以使用BBBadgeBarButtonItem這個第三方套件來完成。

將此加入你的專案後,在要使用的頁面import它。

接著你可以參考以下的程式碼來使用



你就會得到以下的效果







當你的badgeValue沒有設定任何值的時候,這個數字圈圈就會自動消失。

此外,有一些屬性可以讓你設定,你可以參考以下的屬性來做設定。



2016年8月2日 星期二

[Objective-C] NSDate的相關使用方式

NSDate,用於處理時間的類別。

取得當前時間並印出來



要注意的地方有兩個,components要輸入多個參數來告知需要取出什麼樣的類型,

上面的例子我們想取出年月日及星期,因此輸入了四個參數,用|來做區隔。

此外, weekday回傳的數字,1代表星期日,2則為星期一,依序遞增。

接著,你可能會想知道這個月份有幾天,則可以透過以下的程式碼取得



透過rangeOfUnit與inUnit的參數,你可以任意的組合取得你想得到的值,像是一週有幾天,一年有幾天,之類的。

接著,如果你想要針對NSDate做增減,可以看以下的例子。



如果你想將NSDate格式化成字串,可以參考以下的例子。




2016年8月1日 星期一

[Objective-C] Masonry的使用方法

Masonry

這是一個可以幫助你設置Constraint的好幫手,假設我們現在有個View,填滿螢幕,

距離上下左右都為10,使用內建程式碼寫起來會像以下這個樣子。



看起來實在不怎麼好閱讀,且難以維護,但是你只要使用Masonry的話,你可以透過簡短的程式碼,就設置好你想要的Constraint,就像下面的樣子。



甚至,你可以寫的更短一點

而且,Masonry還會自動幫你做完以下兩件事情。



而這三個參數等同於原生的這些

.equalTo 等同於 NSLayoutRelationEqual
.lessThanOrEqualTo 等同於 NSLayoutRelationLessThanOrEqual
.greaterThanOrEqualTo 等同於 NSLayoutRelationGreaterThanOrEqual

而Masonry與原生的NSLayoutAttribute對應如下

MASViewAttributeNSLayoutAttribute
view.mas_leftNSLayoutAttributeLeft
view.mas_rightNSLayoutAttributeRight
view.mas_topNSLayoutAttributeTop
view.mas_bottomNSLayoutAttributeBottom
view.mas_leadingNSLayoutAttributeLeading
view.mas_trailingNSLayoutAttributeTrailing
view.mas_widthNSLayoutAttributeWidth
view.mas_heightNSLayoutAttributeHeight
view.mas_centerXNSLayoutAttributeCenterX
view.mas_centerYNSLayoutAttributeCenterY
view.mas_baselineNSLayoutAttributeBaseline
最後用一個簡單的例子練習來當結尾。

有一個View,於ViewController中垂直水平置中,且寬高為150。

你的程式碼應該會像這個樣子




2016年7月28日 星期四

[Objective-C] JSONModel的使用方法

JSON是相當常見的資料交換格式,透過內建的NSJSONSerialization可以將JSON字串轉換成NSDictionary,在透過Key將Value讀出。

但通常我們不會直接使用這個NSDictionary,而是會在創建一個屬於此JSON資料的Model,使用Model來存取相關的屬性。

NSDictionary轉成Model在傳統的做法必須一層一層解析,程式碼較難維護,且因為人為的疏失可能會輸入錯誤的Key值,而導致一些不可預期的錯誤。

假設目前有個JSON資料如下











你可能會先創一個儲存這些資料的Class,例如



你一開始拿到的原始資料應該會是字串格式,透過NSJSONSerialization轉成NSDictionary,最後在把NSDictionary裡面的資料塞到你剛才創建的Class之中,你的程式碼看起來會像這個樣子。



你必須小心的確認Key有沒有打錯,還要依照不同的資料型態來做處理,若是多層的會寫許多的迴圈才有辦法將所有的JSON資料轉換成你建立的Model。

你可以透過一些第三方套件來完成這些事情,其中一個就是JSONModel。

https://github.com/jsonmodel/jsonmodel

直接下載或者使用CocoaPods將此套件加入到你的專案之中。

把你要儲存資料的Class,繼承JSONModel。



接著你只要將JSON字串塞到初始化之中,他就會將值塞到對應的屬性之中了。



除了字串以外,當然也可以使用字典來初始化(initWithDictionary)。

假如JSON有些屬性是不一定會回傳的,你要在你的屬性之中加入Optional。



這樣在你的JSON資料只有這些時,就不會發生問題。








此外,若是你這個屬性與JSON資料並不相關時,你可以在屬性之中加入Ignore。

JSON裡面有陣列,或者是又有其他的物件,也是可以處理的。

假設你的JSON資料如下。
















JSON資料中有個food的陣列,而陣列內容是另一個JSON物件,這時就要做特別的處理了。

任何是Array型態的Class,你必須在創建一個與該Class名稱一致的protocol,然後放到NSArray時,在NSArray裡面指定的資料型態是該protocol,而不是Class。

此時你的程式碼會像是這個樣子。



接著就可以使用JSONModel來塞入資料了



要拿出Food的內容,可以像上面的程式碼一樣,指定一個變數來存取,

但是有些人可能會想說怎麼不用 . 來存取,因為是資料型態是protocol,所以沒辦法用 . 來存取。

可是你可以使用類似方法的方式來存取屬性。



如此一來大部分的JSON資料應該都可以轉換成物件了,只是要注意如果是Array時的狀況即可,還有你創建的屬性名稱,必須與JSON的Key是一致的。

2016年7月5日 星期二

[iOS] UILabel顯示不同的顏色與字型

有些時候會在同一行裡面顯示不同的字體顏色、大小、字型等,比較笨一點的作法是使用多個UILabel來達成,可是這樣寫起來不怎麼好看也不易管理。

因此,如果想要在同一個UILabel指定不同的字體Style該如何達成呢?

首先先開啟一個新的專案,並將UILabel設置在ViewController之中,接著拉出IBOutlet,為了等等設置文字之用。

比較常會使用的類型有以下兩種

NSFontAttributeName,必須提供UIFont來進行設定

NSForegroundColorAttributeName,必須提供UIColor來進行設定。

接著要注意的是,你必須指定哪幾個字要更改顏色或字體大小,因此會用到NSMakeRange來判斷你的位置。

NSMakeRange要丟入起始點,與要從起始點開始算幾個字。

大概知道觀念後,可以直接看Code來理解

Swift


Objective-C



如此一來你會得到以下的效果


2016年2月2日 星期二

[iOS] AutoLayout 筆記 - ScrollView

ScrollView在設定Layout之中算是特殊種,一開始怎麼設定都不如預期。

一開始假設我們在ViewController之中加入一個ScrollView,並填滿ViewController





















接著,我們想要在ScrollView之中,加入一個高100,全螢幕寬的View,在最上方。

根據以前的經驗,你可能會這樣設定。
























水平距離為 左邊界0
垂直距離為 上邊界0
寬為螢幕大小
高為100

四個條件都吻合了,可是Xcode卻紅通通給你看。

即使按下Update Frames,卻發生不太正常的現象。

整個View變得很詭異
















問題點有兩個,一個一個來解說。

1. 在ScrollView裡面的所有View,寬高均不能以ScrollView的距離來定義。

在一般的View,你塞入一個View,只要將左右邊界距離設為0,你的子View寬就會等於父View,而這樣的效果,在ScrollView是不行的。

因此第一個問題,你的寬必須等於ScrollView,而不是靠距離來等於。



























寬高當然也可以用寫死的方式,像是定義他是100之類的,這是可行的,但是靠邊界來撐大是不行的。

2.在ScrollView裡面的所有View,都必須定義右邊界,下邊界的距離。

ScrollView是可以捲動的,水平是往右捲,而垂直是往下捲,因此你必須定義這個View離右邊界與下邊界的距離為何。

這可能有點難理解一點,不過我們實際動手做看看就知道,拿上一個例子來說,我們現在有一個View,他與螢幕等寬,高度是浮動的,假如超過螢幕高度就可以捲動。


一樣,先設定上左右間距為0,高度先設定為100,根據第一點我們得知,寬高均不能使用距離決定,因此我們將此View設定與ScrollView同寬。

此時你按下Update Frames,你會發現大部分都是你想的結果。

















但是,還是有紅色的錯誤,根據我們前面的說明,必須定義右邊界與下邊界的距離,而我們已經定義了右邊界,而下邊界也沒定義,那我們設定下邊界的距離為0。


















根據以前的經驗,你可能會認為這個白色區塊會填滿整個ScrollView,但是並沒有,而且紅色的錯誤都消失了,因為第一點有提到,所有ScrollView內的View,都不能依照距離來決定寬高。

接著你可以改個顏色跑看看,你會發現他是一個高100,不能捲動的View,因為沒有超出螢幕距離。



























接著我們把這個區塊的高設定的高一些,就能感受到效果了。

找到此View的Hight,將它設定成1500,在試試看。






















你就會得到可以捲動的區塊了,因為我們剛才設定與下邊界為0,因此你捲到最下面還是綠色的。

最後我們試著把下邊界設為30,這樣你捲到最下面會發現,有一小塊是白色的。
















































這樣你對ScrollView設定Layout應該有一定的了解了,

試著在ScrollView多加幾個View看看吧。

2016年1月27日 星期三

[iOS] AutoLayout筆記 - 決定寬高的方法

根據之前的經驗我們知道,設定Constraint必須設定寬高與距離,

而寬高除了很制式的寫下實際的值,我們還有許多方法可以決定一個View的寬高,

而這些方法可以混用,也就是隨著你的需求可以改變不同的做法。

像是高的部分固定寫死,而寬的部分與螢幕同寬等等。

1. 根據水平或垂直距離決定這個View的寬高

舉例來說,這個View我希望距離左右都20,距離上面10,而高為100,





















這麼一來即使你不設定寬,寬也會因為你設定左右約束而被拉開,

這個寬在各個解析度的手機下都會不一樣,某些情況下也許你會需要這樣去設定。

此時,你發現寬好像可以設定,然後設定完後也沒有報出錯誤訊息。



















但是當你執行的時候,你會發現XCode跑出一大串訊息。










因為Constraint衝突了,剛才我們提到寬利用左右間距拉開了,而你又約束它說寬必須等於580,因為前者的約束會因使用者手機而有所不同,因此也許在小一點的手機,前者的約束會讓你的View的寬等於400,而你又強制叫他寬必須等於580,如此一來就發生了衝突。

因此你必須小心使用,當有類似的訊息出來時,也許是發生衝突了。

2. 根據其他View的大小來決定寬高

舉例來說,我希望我的View與螢幕同寬,而高度固定是100,垂直距離為上方往下20

首先你只需要設定這兩個約束






















接著在你的View上按住Control拉線到最外層的View















我們選擇與這個view一樣寬。

最後將我們的view水平置中



















如此一來就完成了,與superView一樣寬的view,並且高為100。

這並不是唯一的做法,你也可以利用第一個做法來完成一樣的效果。

當你越來越熟悉這個工具的時候,你會發現調一個畫面有許多方法可以調到你想要的樣子。

接著我們可以根據需求去調整Constraint,我們找到與superView一樣寬的這條Constraint










































我們可以看到multiplier這個欄位,我們可以針對他做修改。

像是輸入0.5,代表我們的寬要等於superView寬的一半,

當然你也可以輸入2,代表我們的寬等於superView寬的一倍。

這是相當常用的功能之一,

某個View的寬等於另一個View寬的兩倍之類的。

有了這些知識你可以試著調一些現有的Layout,看看你是否能夠瞭解了。

像是調出計算機的樣子。