1.2 UISwitch創(chuàng)建和使用開關(guān)
問題
你想給你的用戶打開一個選項或關(guān)閉的能力。
??????
解
使用UISwitch類。
討論該UISwitch類提供像在圖1-7為自動大寫,自動校正,等等所示的開/關(guān)控制。
圖1-7。UISwitch用在iphone上的應用程序的設(shè)置
為了創(chuàng)建一個開關(guān),你可以使用Interface Builder或者干脆在代碼中創(chuàng)建的實例。讓我們通過代碼做到這一點。所以,接下來的挑戰(zhàn)是確定放置哪個類的代碼,它需要在一個視圖控制器類,我們還沒有討論,但對于應用程序的單一視圖的應用程序類型,我們正在創(chuàng)造的這個家伙 - 器,你可以找到視圖控制器的.m(實現(xiàn))文件ViewController.m。現(xiàn)在打開該文件。
讓我們來創(chuàng)建一個類型UISwitch的屬性和調(diào)用它mainSwitch:
#import "ViewController.h"@interface ViewController ()?????@PRoperty (nonatomic, strong) UISwitch *mainSwitch; @end@implementation ViewController ...
我們現(xiàn)在可以繼續(xù)創(chuàng)建我們的開關(guān)。找到你的視圖控制器的實現(xiàn)文件的viewDidLoad方法:
- (void)viewDidLoad{ [super viewDidLoad];}
讓我們來創(chuàng)建我們的開關(guān),將它放在我們的視圖控制器的view:
- (void)viewDidLoad{ [super viewDidLoad]; /* Create the switch */ self.mainSwitch = [[UISwitch alloc] initWithFrame: CGRectMake(100, 100, 0, 0)]; [self.view addSubview:self.mainSwitch]; }
接下來,我們分配類型UISwitch的對象,并使用initWithFrame:方法初始化初始化我們的開關(guān)。需要注意的是,我們要傳遞給此方法的參數(shù)的類型CGRect的。甲CGRect表示一個矩形的使用矩形,其寬度與高度的左上角的第(x,y)的位置的邊界。我們可以使用CGRectMake聯(lián)方法,其中前兩個參數(shù)傳遞給該方法的第(x,y)的位置上,并在接下來的兩個是矩形的寬度和高度,構(gòu)造一個CGRect。
之后,我們已經(jīng)創(chuàng)建了開關(guān),我們只需將其添加到視圖控制器的視圖。現(xiàn)在,讓我們運行在iOS模擬器應用程序。圖1-8顯示會發(fā)生什么。
正如你所看到的,開關(guān)的默認狀態(tài)是關(guān)閉的。我們可以通過改變UISwitch實例的屬性的值更改。在交開關(guān)上的方法,如下所示:另外,您可以通知seton:
[self.mainSwitch setOn:YES];
你可以通過使用開關(guān)的setOn:animated: 美化的用戶交互。
動畫參數(shù)接受一個布爾值。如果該布爾值設(shè)置為YES,在開關(guān)的狀態(tài)變化(從開到關(guān)或關(guān)上),啟用動畫,就好像被用戶與其進行交互。
很明顯,可以從開關(guān)的接通屬性讀找出開關(guān)是否處于打開或關(guān)閉。或者,您也可以使用交開關(guān)的ison方法,如下所示:
if ([self.mainSwitch isOn]){ NSLog(@"The switch is on.");}else{NSLog(@"The switch is off.");}
如果你想獲得通知當開關(guān)被打開或關(guān)閉,你將需要添加開關(guān)的target ,addTarget:action:forControlEvents: UISwitch的方法,如下所示:
[self.mainSwitch addTarget:self action:@selector(switchIsChanged:) forControlEvents:UIControlEventValueChanged];
然后實現(xiàn)switchIsChanged:方法。當運行時調(diào)用開關(guān)的UIControlEventValueChanged,event會通過在開關(guān)作為參數(shù)傳遞給這個方法,這樣你就可以找出哪個開關(guān)已被觸發(fā)這個事件:
- (void) switchIsChanged:(UISwitch *)paramSender{ NSLog(@"Sender is = %@", paramSender);if ([paramSender isOn]){NSLog(@"The switch is turned on.");}else{NSLog(@"The switch is turned off.");} }
現(xiàn)在繼續(xù)運行在iOS模擬器的應用程序。你會看到類似這樣的消息在控制臺窗口:
Sender is = <UISwitch: 0x6e13500; frame = (100 100; 79 27); layer = <CALayer: 0x6e13700>> The switch is turned off.?Sender is = <UISwitch: 0x6e13500; frame = (100 100; 79 27); layer = <CALayer: 0x6e13700>> The switch is turned on.
1.3自定義UISwitch問題
你已經(jīng)把UISwitch放在UI上,現(xiàn)在想對其進行自定義以滿足您的UI。
解
使用UISwitch,的色彩/圖像的定制屬性之一,如色調(diào)的顏色或onTintColor。
討論
蘋果已經(jīng)做了將定制的UI組件,如UISwitch了出色的工作。在先前的軟件開發(fā)工具包,開發(fā)者只要子類UISwitch只是以改變其外觀和顏色去。現(xiàn)在的iOS SDK使這要簡單得多。
有一個自定義開關(guān)的兩種主要方式:
色調(diào)顏色
色調(diào)的顏色的顏色,你可以應用到用戶界面組件,如UISwitch。著色顏色將在組件的當前顏色的頂部施加。例如,在正常的UISwitch,你就可以看到不同的顏色。當應用著色顏色之上,控制的正常顏色將與色調(diào)色混合,得到關(guān)于UI控制色調(diào)的顏色的風味。
圖片
一個開關(guān)具有兩個圖像:
在圖像
表示開關(guān)的接通狀態(tài)中的圖像。此圖像的寬度為77點,并且其高度為22。
關(guān)圖片
它表示在其斷開狀態(tài)的開關(guān)的圖像。這個圖象,像在開關(guān)的狀態(tài)下,是77個寬度和高度22點。
圖1-9示出了開和關(guān)的開關(guān)的圖像的一個例子。
圖1-9。上一個UISwitch的開和關(guān)的圖像
現(xiàn)在我們知道了兩種狀態(tài)(開和關(guān))開關(guān)的,讓我們通過學習,我們怎樣才能改變開關(guān)的UI組件的色調(diào)顏色開始。這可通過使用的UISwitch類的三個重要的屬性來實現(xiàn)。每一個這種屬性的類型的UIColor的。
tintColor
這是將被施加到開關(guān)的關(guān)斷狀態(tài)下的色調(diào)的色彩。不幸的是,蘋果并沒有花時間去此屬性名稱offTintColor而不是色調(diào)的顏色,使之更加明確。
thumbTintColor
這是將被施加到開關(guān)上的小旋鈕著色顏色。
?1.3。自定義UISwitch|37
onTintColor
此著色顏色將被施加到開關(guān)處于導通狀態(tài)。
下面是一個簡單的代碼片段,將改變開關(guān)的導通模式色調(diào)顏色為紅色時,關(guān)閉模式下色彩色至褐色,而旋鈕的顏色色調(diào)為綠色。這不是色的最佳組合,但會表現(xiàn)出什么這個配方是試圖解釋:
- (void)viewDidLoad { [super viewDidLoad]; /* Create the switch */ self.mainSwitch = [[UISwitch alloc] initWithFrame:CGRectZero]; self.mainSwitch.center = self.view.center; [self.view addSubview:self.mainSwitch]; /* Customize the switch */ /* Adjust the off-mode tint color */self.mainSwitch.tintColor = [UIColor redColor];/* Adjust the on-mode tint color */ self.mainSwitch.onTintColor = [UIColor brownColor]; /* Also change the knob's tint color */ self.mainSwitch.thumbTintColor = [UIColor greenColor];}
現(xiàn)在,我們正用色調(diào)的顏色在上完成的,讓我們繼續(xù)利用其在定制開關(guān)的外觀和關(guān)閉圖像,同時考慮到自定義的開啟和關(guān)閉圖像只適用于iOS6或以上。 iOS的7忽略和關(guān)閉圖像,并且只使用色調(diào)的顏色來定制它的外觀。如之前提到的那樣,無論是上和斷開的圖像中的開關(guān)應寬和22分高大77點。對于這一點,我已經(jīng)準備了一套新的開啟和關(guān)閉圖像(在正常和視網(wǎng)膜分辨率)。我加入他們我的Xcode項目下On@2x.png和Off@2x.png的(視網(wǎng)膜)的名字和我也放在同一個圖像的非視網(wǎng)膜的味道項目。現(xiàn)在我們要建立我們的開關(guān),但開啟和關(guān)閉圖像交換機指定我們的自定義,使用上UISwitch以下屬性:
onImage
如之前所解釋的,這將是該圖像時,開關(guān)處于其上模式顯示的。
offImage
表示該開關(guān),當它處于關(guān)閉模式時的圖像。
這里是我們的代碼片段實現(xiàn)這一嶄新的面貌:
- (void)viewDidLoad { [super viewDidLoad]; /* Create the switch */self.mainSwitch = [[UISwitch alloc] initWithFrame:CGRectZero]; self.mainSwitch.center = self.view.center;/* Make sure the switch won't appear blurry on iOS Simulator */ self.mainSwitch.frame = [self roundedValuesInRect:self.mainSwitch.frame]; [self.view addSubview:self.mainSwitch]; /* Customize the switch */ self.mainSwitch.onImage = [UIImage imageNamed:@"On"]; self.mainSwitch.offImage = [UIImage imageNamed:@"Off"];}
1.4。采摘值的UIPickerView
問題
你要允許你的應用程序的用戶從值列表中進行選擇。
解
使用UIPickerView類。討論
一個選擇器視圖是一個圖形元素,讓您展示一系列值給用戶,讓他們挑一。在iPhone上的時鐘應用程序的定時器部分是這個(圖1-10),一個很好的例子。
圖1-10。在屏幕頂部的選擇器視圖
正如你所看到的,這個特定的選擇器視圖有兩個獨立的,獨立的視覺元素求。一個是在左邊,一個在右邊。左邊的元件被顯示時(例如0,1,2小時等)與一個在右邊顯示的是分鐘(如10,11,12分鐘等)。這兩個項目被稱為組件。每個部件都有行。中的任何組件的任何項實際上由行表示的,正如我們將很快看到。例如,在左側(cè)的元件,“0小時”是行中,“1”是一個行等
讓我們繼續(xù)創(chuàng)建我們的視圖控制器的視圖選擇器視圖。如果你不知道你的視圖控制器的源代碼,請看看食譜1.2,在這個問題進行了討論。
首先,讓我們?nèi)ノ覀兊囊晥D控制器的.M(執(zhí)行)文件的頂部,并確定我們的選擇器視圖:
@interface ViewController ()@property (nonatomic, strong) UIPickerView *myPicker; @end @implementation ViewController...Now let’s create the picker view in the viewDidLoad method of our view controller: - (void)viewDidLoad{ [super viewDidLoad]; self.myPicker = [[UIPickerView alloc] init];
self.myPicker.center = self.view.center; [self.view addSubview:self.myPicker];}
值得注意的是,在這個例子中,我們圍繞我們的選擇器視圖在我們視野的中心。當您運行在iOS7模擬器這個應用程序,你會看到一個空白的屏幕,因為在iOS7的選擇器是白色的,所以是視圖控制器的背景下。
這個選擇器視圖顯示為純白色的原因是,我們還沒有填充它的任何值。讓我們做到這一點。我們做到這一點通過指定數(shù)據(jù)源選擇器視圖,然后確保我們的視圖控制器木棍到數(shù)據(jù)源需要的協(xié)議。 UIPickerView的一個實例的數(shù)據(jù)源必須符合UIPickerViewDataSource協(xié)議,所以讓我們繼續(xù)前進,使我們的視圖控制器符合本協(xié)議中的.m文件:
@interface ViewController () <UIPickerViewDataSource, UIPickerViewDelegate> @property (nonatomic, strong) UIPickerView *myPicker;@end@implementation ViewController
不錯。現(xiàn)在,讓我們改變我們的代碼中實現(xiàn)文件,以確保我們選擇當前視圖控制器作為選擇器視圖的數(shù)據(jù)源:
- (void)viewDidLoad{ [super viewDidLoad]; self.myPicker = [[UIPickerView alloc] init]; self.myPicker.dataSource = self; self.myPicker.center = self.view.center; [self.view addSubview:self.myPicker];}
在此之后,如果你試圖編譯應用程序,你會得到從編譯器的警告,告訴你,你還沒有實現(xiàn)的一些的UIPicker ViewDataSource協(xié)議,希望你能實現(xiàn)的方法。解決這個問題的方法是按命令+ Shift + O,類型UIPickerViewDataSource,然后按鍵盤上的Enter鍵。這將送你到你的代碼的地方,這個協(xié)議被定義,在那里你會看到類似這樣:
@protocol UIPickerViewDataSource<NSObject> @required // returns the number of 'columns' to display. - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView; // returns the # of rows in each component..- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component; @end
你可以看到@Required關(guān)鍵字呢?這告訴我們,無論哪個階層要成為一個選擇器視圖必須實現(xiàn)這些方法的數(shù)據(jù)來源。很劃算。讓我們在我們的視圖控制器的實現(xiàn)文件的貫徹落實:
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{if ([pickerView isEqual:self.myPicker]){ return 1;}return 0; }-(NSInteger) pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component{if ([pickerView isEqual:self.myPicker]){ return 10;}return 0; }
因此,這里發(fā)生了什么?讓我們一起來看看這些是什么數(shù)據(jù)源方法中的每一個期望:
numberOfComponentsInPickerView:
此方法將你一個選擇器視圖對象作為它的參數(shù),希望你返回一個整數(shù),告訴運行時,你將有多少成分是喜歡選擇器視圖來呈現(xiàn)。
pickerView:numberOfRowsInComponent:
對于被添加到一個選擇器視圖中的每個組件,您需要告訴系統(tǒng)你有多少行想在組件呈現(xiàn)。此方法將你的選擇器視圖的實例,你將需要返回一個整數(shù),表示行數(shù)來呈現(xiàn)該組件。
因此,在這種情況下,我們要求系統(tǒng)顯示組件1只10,我們之前已經(jīng)創(chuàng)建了一個選擇器視圖,稱為myPicker行。
編譯并運行在iPhone模擬器(圖1-11)的應用程序。 EWWW,那是什么?
它看起來像我們的選擇器視圖知道它應該有多少分量,應該有多少個行渲染的成分,但不知道以顯示每行的文本內(nèi)容。這是我們現(xiàn)在需要做的事情,而我們做到這一點提供了一個代表到選擇器視圖。 UIPickerView的一個實例的代表有,以符合UIPickerViewDelegate協(xié)議,并且必須執(zhí)行該協(xié)議的所有@Required方法。
只有一個方法,在UIPickerViewDelegate我們感興趣的是: pick erView:titleForRow:forComponent:方法。這種方法將通過您的當前節(jié)和當前行中的第一個選擇器視圖索引的索引,它期望你返回的NSString的實例。這個字符串就會得到渲染該組件內(nèi)部的特定行。在這里,我只想以顯示第一行的第1行,然后繼續(xù)第2行,3行,等等,直到結(jié)束。請記住,我們也有我們的設(shè)置選擇器視圖的委托財產(chǎn):
self.myPicker.delegate = self;
現(xiàn)在,我們將要處理,剛才了解了的委托方法:
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)rowforComponent:(NSInteger)component{ if ([pickerView isEqual:self.myPicker]){/* Row is zero-based and we want the first row (with index 0) to be rendered as Row 1, so we have to +1 every row index */ return [NSString stringWithFormat:@"Row %ld", (long)row + 1];}return nil; }
現(xiàn)在,讓我們運行我們的應用程序,看看會發(fā)生什么(圖1-12)。
圖1-12。有一個部分和幾行選擇器視圖
??????
Picker views在舊的 IOS6 中突出使用了一個名為showsSelectionIndicator屬性,它在默認情況下被設(shè)置為NO當前的選擇。您可以直接設(shè)置該屬性的值YES或使用setShowsSelectionIndicator:選擇器視圖的方法把這個指標上:
self.myPicker.showsSelectionIndicator = YES;
現(xiàn)在,假設(shè)你已經(jīng)創(chuàng)建了你的最終應用這個選擇器視圖。什么是使用選擇器視圖中,如果我們無法檢測哪些用戶在其每一個部件實際上已經(jīng)選擇了?嗯,這是很好的,蘋果已經(jīng)想到了這一點,給我們要問的是選擇什么樣的選擇器視圖的能力。致電selectedRowInCompo新界東北:一個UIPickerView的方法,并通過組件的從零開始的索引。該方法會返回一個整數(shù),表明目前在該組件中選擇的行的從零開始的索引。
如果您需要修改的值,在運行時你的選擇器視圖,您需要確保您的選擇器視圖的數(shù)據(jù)源和委托重新加載數(shù)據(jù)。要做到這一點,你可以強制所有的組件重新加載其數(shù)據(jù),使用reloadAllCompo堂費的方法,或者你可以問一個具體的組件重新加載其數(shù)據(jù),使用reload組件:方法和傳遞具有的組件的索引重新加載。
另請參閱
食譜1.2
新聞熱點
疑難解答