2018-06-07 開始我的控件之旅

一.UIImageView

1.導(dǎo)入圖片

將文件夾內(nèi)想要添加的圖片拖動(dòng)到圖示位置,1x,2x,3x分別是原圖和兩張像素倍數(shù)為2、3倍的Retina高清版。


2.加入控件

3.屬性介紹

在右側(cè)工具欄我們可以看到UIImageView的一些屬性。


  • Content Mode:用于選擇內(nèi)容在視圖內(nèi)部的顯示方式,即圖像在視圖內(nèi)的對(duì)齊方式,以及是否縮放圖像以適應(yīng)視圖大小,在這里,Scale To Fill即使視圖和它的圖像尺寸一致。
  • Tag:UIView的所有子類,包括所有的視圖和控件,都有一個(gè)tag屬性。用于標(biāo)識(shí)界面對(duì)象的一種與語言無關(guān)的方法。
    例如,假如有5個(gè)不同的按鈕,每個(gè)按鈕都有一個(gè)不同的標(biāo)題,但我們希望用一個(gè)操作方法來處理這5個(gè)按鈕的點(diǎn)擊事件??梢酝ㄟ^tag來區(qū)分這5個(gè)按鈕。
  • Interaction:與用戶交互有關(guān)。
    User Interaction Enabled指定用戶能否與當(dāng)前對(duì)象進(jìn)行交互,如果不勾選,則控件永遠(yuǎn)不能觸發(fā)操作方法。但是,圖像視圖默認(rèn)不選中該復(fù)選框,因?yàn)樗鼈兺ǔS糜陟o態(tài)信息的顯示。
    Multiple Touch則決定了當(dāng)前控件能否接收多點(diǎn)觸摸事件,可以支持各種復(fù)雜的手勢(shì)。
  • Alpha:圖像的透明度,0.0是完全透明,1.0是完全不透明。如果值<1.0,即使圖像背后沒有任何內(nèi)容,應(yīng)用程序也會(huì)在運(yùn)行時(shí)占用處理器周期來疊加半透明視圖后面的空白區(qū)域。
  • Background:用于確定視圖的背景顏色,只有當(dāng)圖像沒有填滿整個(gè)視圖,或者顯示在縱橫比4:3的iPad上,或者圖像某些部分透明的情況下,這個(gè)屬性才起作用。
  • Tint:指定所選視圖的高光顏色。
  • Drawing:
  1. Opaque:告訴iOS當(dāng)前視圖的背后沒有需要繪制的內(nèi)容,同時(shí)允許iOS的繪圖方法通過一些優(yōu)化當(dāng)前視圖的繪制。
  2. Hidden:選中之后,用戶就看不到該對(duì)象了。
  3. Clears Graphics Context:選中后,iOS會(huì)在實(shí)際繪制對(duì)象之前使用透明的黑色繪制被對(duì)象覆蓋的所有區(qū)域。因?yàn)樾阅軉栴},這個(gè)選項(xiàng)基本不需要選中。
  4. Clip to Bounds:如果視圖中包含子視圖,并且這些子視圖沒有完全包含在其父視圖的邊界內(nèi),那么這個(gè)復(fù)選框的值可以決定子視圖的繪制方式。如果選中了該選項(xiàng),那么只有位于父視圖邊界內(nèi)的子視圖部分會(huì)繪制出來;如果不選中,那么子視圖會(huì)被完全繪制出來,不管子視圖是否超出了父視圖的邊界。但是因?yàn)橛?jì)算裁剪區(qū)域是比較消耗資源的操作,所以一般默認(rèn)為關(guān)閉,當(dāng)然,需要的時(shí)候可以啟用一下。
  • Stretching: 可以忽略,因?yàn)橹挥性谄聊簧险{(diào)整矩形視圖大小導(dǎo)致重繪視圖的時(shí)候才需要拉伸。該選項(xiàng)用于保持視圖的外邊緣(例如按鈕的邊框)不變,僅拉伸中間部分,而不是均勻拉伸視圖的全部?jī)?nèi)容。
    這里需要設(shè)置4個(gè)浮點(diǎn)值,用于指定一個(gè)矩形可拉伸區(qū)域的左上角的坐標(biāo)以及大小,取值范圍0~1,代表整個(gè)視圖大小的部分。
    例如:如果希望每個(gè)邊緣最外邊的10%是不可拉伸的,那么就將X和Y都設(shè)為0.1,同時(shí)將width和height都設(shè)為0.8。

二.Text Field

1.相應(yīng)的屬性

在右側(cè)工具欄我們可以看到Text Field的一些屬性。


  • Text: 分為Plain Text(純文本)和Attributed Text(屬性文本,包含各種字體和不同的屬性)。
    之后是一系列用于設(shè)置字體和字體顏色的控件,Color的默認(rèn)值是黑色。
  • Font:右邊的控件可以用來增大或縮小文本大小,左邊的部分可以用來手動(dòng)編輯字體名稱和字體大小。
    下面的五個(gè)按鈕是對(duì)齊方式。
  • Placeholder(占位符):可以在這里輸入一些文本,當(dāng)文本框內(nèi)容為空時(shí),Placeholder的內(nèi)容就相當(dāng)于一個(gè)Hint,以灰色字體顯示其中。
  • Background和Disabled,僅在需要定制文本框的外觀時(shí)使用。
  • Border Style:用于更改文本框邊框的繪制方式,默認(rèn)值(最右邊的按鈕)創(chuàng)建的文本框樣式是最慣用的。
  • Clear Button: 可以設(shè)置何時(shí)出現(xiàn)清除按鈕,它會(huì)出現(xiàn)在文本框最右邊的X形小按鈕。
  • Clear when editing begins:指定用戶觸摸此字段時(shí)是否清除已有的文本,如果選中該復(fù)選框,則之前該字段的任何內(nèi)容都將被清除,用戶需要重新輸入。
  • Min Font Size:用來設(shè)置文本框在顯示文本的時(shí)候可以選中的最小字號(hào)。
  • Adjust to Fit:指定顯示文本是否應(yīng)隨文本框尺寸的變化而變化,如果選中,則整個(gè)文本在視圖中都是可見的,即使文本大于所分配的空間。
  • Capitalization:如果期望用戶輸入一個(gè)名字,則可以將其設(shè)置為Words,可以保證每個(gè)輸入的單詞都會(huì)自動(dòng)轉(zhuǎn)換為首字母大寫。
  • Return Key:Return鍵即虛擬鍵盤右下方的一個(gè)鍵,如果在Safari的搜索框輸入文本,則會(huì)變成Search。
  • Auto-enable Return Key:在文本框內(nèi)容為空時(shí)Return鍵將會(huì)被禁用,直到至少在文本框輸入一個(gè)字符。
  • Secure Text Entry:指定是否在文本框顯示已輸入的字符,如果此文本要用作密碼字段,則應(yīng)該選中次復(fù)選框。
    接下來的部分就是和UIImageView顯示的一樣了,注意選中Opaque,不要選Clears Graphics Context和Clip to Bounds就好了。

2.按下Done按鈕之后的隱藏鍵盤


第一響應(yīng)者即當(dāng)前正在與用戶進(jìn)行交互的控件,因此,我們通知該控件放棄作為第一響應(yīng)者的控制權(quán),將其返還給用戶之前的操作。

- (IBAction)textFieldDoneEditing:(id)sender {
    [sender resignFirstResponder];
}

3.觸摸背景關(guān)閉鍵盤

UIControl是UIView的子類,因此,如果從UIView創(chuàng)建實(shí)例,更改為從UIControl類創(chuàng)建實(shí)例,則獲得了觸發(fā)操作方法的能力。首先我們創(chuàng)建一個(gè)點(diǎn)擊背景需要調(diào)用的操作方法(隱藏TextField)

- (IBAction) backgroundTap:(id)sender
{
    [self.nameField resignFirstResponder];
    [self.numberField resignFirstResponder];
}

然后選中容器視圖(注意是整個(gè)容器視圖),將class類型改成UIControl。



最后,把TouchDown事件拖動(dòng)到View Controller圖標(biāo)上面,選擇我們的方法:backgroundTap,則可以達(dá)成我們的效果了。


三.滑動(dòng)條

創(chuàng)建方法并將滑動(dòng)條和該方法相關(guān)聯(lián):

- (IBAction)sliderChanged:(UISlider *)sender {
    //獲得滑動(dòng)條進(jìn)度
    int progress = (int) lroundf(sender.value);
    //設(shè)置label顯示的滑動(dòng)條進(jìn)度
    self.sliderLabel.text = [NSString stringWithFormat: @"%d", progress];
}

需要初始化我們的Label顯示的進(jìn)度:

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.sliderLabel.text = @"100";
}

四.Segment、Switch和Button

創(chuàng)建Segment并設(shè)置toogleControls方法,用于控制哪些控件應(yīng)該顯示。

- (IBAction)toggleControls:(UISegmentedControl *)sender {
    if (sender.selectedSegmentIndex == 0) {
        self.leftSwitch.hidden = NO;
        self.rightSwitch.hidden = NO;
        self.doSomethingButton.hidden = YES;
    }
    else {
        self.leftSwitch.hidden = YES;
        self.rightSwitch.hidden = YES;
        self.doSomethingButton.hidden = NO;
    }
}

設(shè)置兩個(gè)Switch的開關(guān)方法,使它們的狀態(tài)保存同步:

- (IBAction)switchChanged:(UISwitch *)sender {
    //設(shè)置一個(gè)開關(guān)的值會(huì)同時(shí)改變另一個(gè)開關(guān)的值
    BOOL setting = sender.isOn;
    [self.leftSwitch setOn: setting animated: YES];
    [self.rightSwitch setOn: setting animated: YES];
}

設(shè)置Button的背景為WhiteButton:



并設(shè)置相應(yīng)的屬性如下:



在這里科普一下iOS的控件狀態(tài):
  • Normal:默認(rèn)的普通狀態(tài)。
  • Highlighted:控件正被使用時(shí)的狀態(tài),對(duì)于按鈕來說,表示用戶手指正在按鈕上。
  • Disabled:控件被關(guān)閉的狀態(tài),可以在Interface Builder中取消Enabled復(fù)選框,或?qū)⒖丶膃nabled屬性設(shè)置為NO。
  • Selected:只有小部分控件支持狀態(tài)。通常用于指示該控件已啟用或被選中。與Highlighted類似,但是失去了焦點(diǎn)之后依舊可以保持使用狀態(tài)。

五.操作表單和警告視圖

  • 操作表單(ActionSheet)的作用是要求用戶在兩個(gè)以上選項(xiàng)之間做出選擇。在iPhone上,操作表單從屏幕底部出現(xiàn),顯示一系列按鈕供用戶選擇。
  • 警告視圖(Alert)以圓角矩形的形式出現(xiàn)在屏幕中央,要求用戶必須做出一個(gè)回應(yīng)才能繼續(xù)使用應(yīng)用程序。通常用于通知用戶發(fā)生了一些重要的或者不尋常的事情。

它們均由UIAlertController創(chuàng)建,需要在preferredStyle設(shè)置UIAlertControllerStyleActionSheet(操作表單)/UIAlertControllerStyleAlert(警告視圖)。

1.創(chuàng)建一個(gè)操作表單

UIAlertController *controller =
[UIAlertController alertControllerWithTitle: @"Are you sure?"
                                    message: nil
                            preferredStyle: UIAlertControllerStyleActionSheet];

設(shè)置兩個(gè)UIAlertAction:yesAction和noAction。

UIAlertAction *yesAction =
[UIAlertAction actionWithTitle: @"Yes, I'm sure!"
                        style: UIAlertActionStyleDestructive
                       handler: ^(UIAlertAction *action) {
  //后續(xù)操作
}
UIAlertAction *noAction = [UIAlertAction actionWithTitle: @"No way!"
                                                   style: UIAlertActionStyleCancel
                                                 handler: nil];

其中,對(duì)于每個(gè)按鈕來說,都有三種style:

  • UIAlertActionStyleDestructive:以紅色粗體顯示。
  • UIAlertActionStyleDefault:以藍(lán)色一般字體顯示。
  • UIAlertActionStyleCancel:以藍(lán)色粗體顯示。

往UIAlertController中添加這兩種Action:

[controller addAction: yesAction];
[controller addAction: noAction];

為了讓警告視圖或操作表單顯示出來,需要讓當(dāng)前視圖控制器來展示警告控制器。

UIPopoverPresentationController *ppc = controller.popoverPresentationController;
if (ppc != nil) {
    ppc.sourceView = sender;
    ppc.sourceRect = sender.bounds;
}
[self presentViewController: controller
                   animated:YES
                 completion:nil];

通過獲取到警告控制器的懸浮展示控制器,并設(shè)置它的sourceView和sourceRect屬性來設(shè)定操作表單會(huì)出現(xiàn)的位置。

最后調(diào)用presentViewController的方法,將警告控制器作為展示的控制器以顯示操作表單。在展示視圖控制器時(shí),被展示的視圖會(huì)暫時(shí)取代展示它的視圖控制器的視圖。

對(duì)于警告控制器,操作表單或警告視圖會(huì)部分覆蓋展示它們的視圖控制器的視圖,而視圖的剩余部分會(huì)被陰影覆蓋。

設(shè)置完之后,可以看到效果如下:


2.創(chuàng)建一個(gè)警告視圖

在上面的操作中,我們留了一個(gè)坑:在點(diǎn)擊了確認(rèn)按鈕之后有個(gè)TODO,在這里,我們的TODO就是顯示一個(gè)警告視圖。

NSString *msg;
if ([self.nameField.text length] > 0) {
    msg = [NSString stringWithFormat: @"%@, Everything is OK.", self.nameField.text];
}
else {
    msg = [NSString stringWithFormat: @"Everything is OK."];
}
UIAlertController *controller2 = [UIAlertController
                                  alertControllerWithTitle: @"Something was done!"
                                  message: msg
                                  preferredStyle: UIAlertControllerStyleAlert];
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle: @"Phew!"
                                                       style: UIAlertActionStyleCancel
                                                     handler: nil];
[controller2 addAction: cancelAction];
[self presentViewController: controller2
                   animated:YES
                 completion:nil];

很類似地,我們首先聲明一個(gè)UIAlertController并設(shè)置preferredStyle為UIAlertControllerStyleAlert,說明這是一個(gè)警告視圖類型的控制器。

然后,我們?cè)O(shè)置一個(gè)UIAlertAction,在這里只需設(shè)一個(gè)cancelAction即可,聲明title和style后,將Action添加到Controller里面去。

最后調(diào)用presentViewController方法,使得AlertController能夠在主視圖中顯示出來。


踩過的坑

  1. 當(dāng)調(diào)整進(jìn)度條的時(shí)候,由于數(shù)值位數(shù)的改變,按鈕也會(huì)隨著移動(dòng)。



    這是因?yàn)閿?shù)值Label的寬度沒有固定好,而Label和Switch之間有個(gè)約束,因此他們會(huì)產(chǎn)生相對(duì)移動(dòng)。
    解決方法:勾選Label的Width和Height選項(xiàng),代表這個(gè)控件大小已經(jīng)固定。


  2. 模擬器的鍵盤調(diào)不出來


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明AI閱讀 16,210評(píng)論 3 119
  • 原文鏈接:https://github.com/opendigg/awesome-github-android-u...
    IM魂影閱讀 33,166評(píng)論 6 472
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 47,163評(píng)論 22 665
  • 看到書放在沙發(fā)上,悠悠沿著沙發(fā)的邊,走到了書旁邊。偷偷看系列之《恐龍》,悠悠邊翻邊呀呀作語。我坐在一旁看她看書,歲...
    悠悠麻麻2016閱讀 134評(píng)論 0 0
  • ??????????????????? ??????????????????????????
    c058e240ab1b閱讀 862評(píng)論 0 0

友情鏈接更多精彩內(nèi)容