通遼做網(wǎng)站通過seo來賺錢百度seo培訓(xùn)
UI學(xué)習(xí)
- 一:UIView基礎(chǔ)
- frame屬性
- 隱藏視圖對(duì)象:
- UIView的層級(jí)關(guān)系
- 二:UIWindow對(duì)象
- 三:UIViewController基礎(chǔ)
- UIViewController使用
- 四:定時(shí)器與視圖移動(dòng)
- 五:UISwitch控件
- 六:滑動(dòng)條和進(jìn)度條
- 七:步進(jìn)器和分欄控件
- 八:警告對(duì)話框和等待提示器
- 九:UITextField
- 滾動(dòng)視圖
- 滾動(dòng)視圖基礎(chǔ)
- 滾動(dòng)視圖高級(jí)
- 總結(jié)
一:UIView基礎(chǔ)
我們先來介紹一下frame屬性
frame屬性
frame框架可以理解為視圖在父視圖中的位置和大小的描述。具體來說,frame框架包括視圖的原點(diǎn)坐標(biāo)和寬高兩個(gè)屬性。
- 原點(diǎn)坐標(biāo)(origin):原點(diǎn)坐標(biāo)表示視圖在父視圖坐標(biāo)系統(tǒng)中的位置,通常是相對(duì)于父視圖左上角的距離。原點(diǎn)坐標(biāo)是一個(gè)CGPoint對(duì)象,包括x和y兩個(gè)屬性。
- 寬高(size):寬高表示視圖在父視圖中的大小,通常是視圖的寬度和高度。寬高是一個(gè)CGSize對(duì)象,包括width和height兩個(gè)屬性
而CGRectMake是一個(gè)用來創(chuàng)建CGRect結(jié)構(gòu)體的函數(shù),該函數(shù)傳入四個(gè)參數(shù),分別為原點(diǎn)坐標(biāo)的x和y,寬高的width和height。
簡(jiǎn)而言之,我們對(duì)frame屬性初始化,傳入前兩個(gè)參數(shù)確定開始位置,傳入后兩個(gè)參數(shù)作為視圖的大小。這也是其他控件的基本屬性。
UIview是iOS的視圖對(duì)象,是顯示在屏幕上的所有對(duì)象的基礎(chǔ)類,
也就是說,所有顯示在屏幕上的對(duì)象一定都繼承與UIView,屏幕上所有能看到的對(duì)象都是UIView的子類
- UIView是一個(gè)矩形對(duì)象,有背景顏色,可以顯示,有層級(jí)關(guān)系
- frame屬性是UIView的基本屬性,而UiView是其他對(duì)象的父類,因此所有對(duì)象都有該屬性。
下面使用代碼來展示UIView的基礎(chǔ)內(nèi)容:
- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.//初始化一個(gè)UIview對(duì)象UIView *view = [[UIView alloc] init];//設(shè)置UIview的位置view.frame = CGRectMake(100, 100, 100, 200);view.backgroundColor = [UIColor orangeColor];//將新建的視圖添加到父親視圖上//1:將新建的視圖顯示到屏幕上//2:將視圖作為父親視圖的子視圖管理起來[self.view addSubview:view];//將自己從父親視圖刪除掉//1.從父親視圖的管理中刪除//2.不會(huì)顯示在屏幕。//[view removeFromSuperview] ;
}
效果:
隱藏視圖對(duì)象:
分別有三種方法:
- 設(shè)置hidde屬性:是否隱藏
- 設(shè)置alpha屬性:設(shè)置透明度
- 設(shè)置opaque屬性:是否顯示不透明
//是否隱藏視圖對(duì)象//YES:不顯示//NO:顯示,默認(rèn)值為NOview.hidden = YES;//設(shè)置視圖的透明度//alpha= 1:不透明//a = 0 :透明//a = 0.5: 半透明view.alpha = 1;//設(shè)置是否顯示不透明view.opaque = YES;
UIView的層級(jí)關(guān)系
UIview是在父視圖中可以用self.view.subviews[]的數(shù)組下標(biāo)來查看,而這個(gè)數(shù)組是有順序的,即層級(jí)關(guān)系。
- 先加入的視圖,在數(shù)組的開始,即在屏幕的最底層。
- 重復(fù)加入,不會(huì)開辟新的數(shù)組位置,而是移動(dòng)數(shù)組的排序方式。
- 可以使用bringSubviewToFront、sendSubviewToBack等方法來改變視圖的順序。
- removeFromSuperview方法可以刪除子視圖。
- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.UIView *view1 = [[UIView alloc] init];view1.frame = CGRectMake(100, 100, 150, 150);view1.backgroundColor = [UIColor orangeColor];UIView *view2 = [[UIView alloc] init];view2.frame = CGRectMake(125, 125, 150, 150);view2.backgroundColor = [UIColor blueColor];UIView *view3 =[[UIView alloc] init];view3.frame = CGRectMake(150, 150, 150, 150);view3.backgroundColor = [UIColor blackColor];//將三個(gè)視圖對(duì)象顯示到屏幕上并且添加到父親視圖上。//重復(fù)加入已有元素,不會(huì)擴(kuò)大數(shù)組,而是移動(dòng)數(shù)組[self.view addSubview:view1];[self.view addSubview:view2];[self.view addSubview:view3];[self.view addSubview:view1];//[self.view addSubview:view2];//將某一個(gè)視圖調(diào)整到最前面顯示//參數(shù):UIView對(duì)象,調(diào)整到一個(gè)視圖到最前方//實(shí)際上也移動(dòng)了數(shù)組的位置。// [self.view bringSubviewToFront:view1];//將某一個(gè)視圖調(diào)整到最后顯示//參數(shù):UIView對(duì)象,調(diào)整哪一個(gè)視圖到最后//實(shí)際上也移動(dòng)了數(shù)組的位置// [self.view sendSubviewToBack:view3];UIView *viewFront = self.view.subviews[0];// [view1 removeFromSuperview];UIView *viewBack = self.view.subviews[2];if (viewFront == view2) {NSLog(@"等于");}if (viewBack == view1) {NSLog(@"等于");}
}
效果:
同時(shí),我們可以驗(yàn)證重復(fù)添加視圖,是移動(dòng)數(shù)組位置而不是創(chuàng)建新的數(shù)組。
二:UIWindow對(duì)象
注意:在XCode13之后我們使用代碼來創(chuàng)建初始化一個(gè)UIWindow對(duì)象不在AppDelegate類中進(jìn)行,而是在SceneDelegate類進(jìn)行,并且不需要?jiǎng)?chuàng)建UIWindow對(duì)象,只需要為其初始化視圖管理器后即可進(jìn)行使用。
UIWindow對(duì)象是UIView最頂層的容器,包含應(yīng)用并顯示所有的UIView對(duì)象。同時(shí),也可以反映傳遞事件給UIView。
下面是UIWindow的一些基本使用。
SceneDelegate.m文件
#import "SceneDelegate.h"@interface SceneDelegate ()@end@implementation SceneDelegate- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {//對(duì)UIWindow對(duì)象創(chuàng)建視圖控制器self.window.rootViewController = [[UIViewController alloc] init] ;//設(shè)置背景顏色self.window.backgroundColor = [UIColor blackColor];//直接給window上添加視圖UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 200)];view1.backgroundColor = [UIColor blueColor];UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(150, 0, 50, 200)];view2.backgroundColor = [UIColor redColor];//當(dāng)創(chuàng)建一個(gè)新的背景視圖,然后將這個(gè)視圖作為window的子視圖,再讓view1作為背景視圖的子視圖,就會(huì)有一個(gè)層級(jí)關(guān)系//當(dāng)移動(dòng)背景視圖的時(shí)候,view1視圖也會(huì)隨著移動(dòng),子視圖是參照父視圖的坐標(biāo)系UIView *backview = [[UIView alloc] initWithFrame:CGRectMake(100, 400, 200, 200)];backview.backgroundColor = [UIColor whiteColor];//將子視圖添加到爸爸視圖上[backview addSubview:view1];[backview addSubview:view2];[self.window addSubview:backview];NSLog(@"%@", view1.window);NSLog(@"%@", backview.window);NSLog(@"%@", self.window);//使window有效并顯示到屏幕上[self.window makeKeyAndVisible];}
效果:
同時(shí),通過對(duì)三個(gè)window對(duì)象的打印,我們可以印證整個(gè)程序僅有一個(gè)UIWindow對(duì)象。
三:UIViewController基礎(chǔ)
UIViewController是視圖控制器的意思。整個(gè)UIKit框架中只能有一個(gè)根視圖控制器,屬于window屬性,但是可以有多個(gè)視圖控制器,視圖控制器用來管理界面和處理界面的邏輯類對(duì)象,程序啟動(dòng)前必須對(duì)根視圖控制器賦值。
我們?cè)赟ceneDelegate.m文件中實(shí)現(xiàn)對(duì)根視圖控制器的初始化。
#import "SceneDelegate.h"
#import "ViewController.h"
@interface SceneDelegate ()@end@implementation SceneDelegate- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {ViewController *vcRoot = [[ViewController alloc] init];self.window.rootViewController = vcRoot;self.window.backgroundColor = [UIColor redColor];}
UIViewController使用
通過對(duì)UIViewController的學(xué)習(xí),我們可以實(shí)現(xiàn)視圖控制界面的切換。下面我們實(shí)操來加深學(xué)習(xí)。
首先,我們需要?jiǎng)?chuàng)建視圖控制器,并為其初始化不同的顏色。
之后我們可以調(diào)用presentViewController方法,實(shí)現(xiàn)顯示一個(gè)新的視圖控制器界面到屏幕上。再在新的view文件中使用dismissViewControllerAnimated方法(關(guān)閉當(dāng)前視圖控制器界面),回到原來的視圖控制器界面。
具體實(shí)現(xiàn)代碼:
ViewController.m文件
#import "ViewController.h"
#import "ViewC02.h"
@interface ViewController ()@end@implementation ViewController-(void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{//創(chuàng)建視圖控制器二ViewC02* vc = [[ViewC02 alloc] init];//整個(gè)屏幕vc.modalPresentationStyle = UIModalPresentationFullScreen;//顯示一個(gè)新的視圖控制器到屏幕上//P1:新的視圖控制器對(duì)象//P2:使用動(dòng)畫切換動(dòng)畫效果//P3:切換結(jié)束后功能調(diào)用,不需要?jiǎng)t穿nil[self presentViewController:vc animated:YES completion:nil];
}
//第一次程序加載視圖時(shí)調(diào)用
//只調(diào)用一次
- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.self.view.backgroundColor = [UIColor blueColor];NSLog(@"viewDidLoad 第一次加載!");
}//當(dāng)視圖控制器的視圖即將顯示時(shí),調(diào)用次函數(shù)
//視圖分為:1.顯示前 2.正在處于顯示狀態(tài) 3.已經(jīng)被隱藏
//參數(shù):是否用動(dòng)畫切換后顯示
- (void) viewWillAppear:(BOOL)animated
{NSLog(@"viewWillAppear,視圖即將顯示!");
}
//視圖即將消失,調(diào)用次函數(shù)
//參數(shù):表示是否用動(dòng)畫切換后消失
//當(dāng)前的狀態(tài):視圖還顯示在屏幕上
-(void) viewWillDisAppear:(BOOL)animated
{NSLog(@"視圖即將消失!");
}//當(dāng)視圖已經(jīng)顯示到屏幕后到瞬間調(diào)用次函數(shù)
//參數(shù):表示是否用動(dòng)畫切換顯示的
//當(dāng)前狀態(tài):已經(jīng)顯示到屏幕上
-(void) viewDidAppear:(BOOL)animated
{NSLog(@"視圖已經(jīng)顯示");
}//當(dāng)前視圖已經(jīng)從屏幕上消失
//參數(shù):表示是否用動(dòng)畫切換顯示的
//當(dāng)前狀態(tài):當(dāng)前視圖控制器視圖已經(jīng)消失
-(void) viewDidDisappear:(BOOL)animated
{NSLog(@"視圖已經(jīng)消失!");
}
@end
ViewC02.m文件:
#import "ViewC02.h"@interface ViewC02 ()@end@implementation ViewC02- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.self.view.backgroundColor = [UIColor orangeColor];
}-(void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{ //點(diǎn)擊屏幕后使當(dāng)前視圖控制器界面消失。[self dismissViewControllerAnimated:YES completion:nil];
}
效果:點(diǎn)擊前:
點(diǎn)擊后:
上圖代碼中,我們還加入了一些操作函數(shù),來顯示屏幕的調(diào)用。
注意:添加下述代碼后,才會(huì)使整個(gè)屏幕切換,從而顯示viewDidDisappear操作函數(shù)。
vc.modalPresentationStyle = UIModalPresentationFullScreen;
代碼運(yùn)行結(jié)果:
四:定時(shí)器與視圖移動(dòng)
創(chuàng)建一個(gè)定時(shí)器,先要在接口文件中創(chuàng)建NSTimer屬性。
@property (retain, nonatomic) NSTimer *timerVier;
之后,采用scheduledTimerWithTimeInterval:的類方法來創(chuàng)建定時(shí)器。并啟動(dòng)該定時(shí)器。
該方法有五個(gè)參數(shù):
P1:每隔多長(zhǎng)時(shí)間調(diào)用定時(shí)器函數(shù),以秒為單位
P2:表示實(shí)現(xiàn)定時(shí)器函數(shù)的對(duì)象(指針)
P3:定時(shí)器函數(shù)對(duì)象
P4:可以傳入定時(shí)器函數(shù)中一個(gè)參數(shù),無參數(shù)可以傳nil
P5:定時(shí)器是否重復(fù)操作,YES為重復(fù),NO只完成一次函數(shù)調(diào)用
而我們要實(shí)現(xiàn)使指定view對(duì)象移動(dòng),需要先為view對(duì)象設(shè)置一個(gè)標(biāo)簽值,在定時(shí)器的事件函數(shù)中進(jìn)行使用。
下列代碼中的view.frame =CGRectMake(view.frame.origin.x+1, view.frame.origin.y+1, 80, 80);即實(shí)現(xiàn)這一功能,使view視圖的x,y軸隨時(shí)間移動(dòng)。
ViewController.m文件
#import "ViewController.h"@interface ViewController ()@end@implementation ViewController@synthesize timerVier = _timerVier;- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];btn.frame = CGRectMake(100, 100, 80, 40);[btn setTitle:@"啟動(dòng)定時(shí)器" forState:UIControlStateNormal];[btn addTarget:self action:@selector((pressStart)) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:btn];UIButton *btnStop = [UIButton buttonWithType:UIButtonTypeRoundedRect];btnStop.frame = CGRectMake(100, 200, 80, 40);[btnStop setTitle:@"停止定時(shí)器" forState:UIControlStateNormal];[btnStop addTarget:self action:@selector(pressStop) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:btnStop];UIView *view = [[UIView alloc] init];view.frame = CGRectMake(0, 0, 80, 80);view.backgroundColor = [UIColor blueColor];[self.view addSubview:view];//設(shè)置view對(duì)標(biāo)簽值//通過爸爸視圖對(duì)象以及view的標(biāo)簽值可以獲得相應(yīng)的對(duì)象view.tag = 101 ;
}//按下開始按鈕函數(shù)
- (void) pressStart
{//NSTimer的類方法創(chuàng)建一個(gè)定時(shí)器并啟動(dòng)這個(gè)定時(shí)器//P1:每隔多長(zhǎng)時(shí)間調(diào)用定時(shí)器函數(shù),以秒為單位//P2:表示實(shí)現(xiàn)定時(shí)器函數(shù)的對(duì)象(指針)//P3:定時(shí)器函數(shù)對(duì)象//P4:可以傳入定時(shí)器函數(shù)中一個(gè)參數(shù),無參數(shù)可以傳nil//P5:定時(shí)器是否重復(fù)操作,YES為重復(fù),NO只完成一次函數(shù)調(diào)用//返回值為一個(gè)新建好的定時(shí)器對(duì)象_timerVier = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(updateTimer:) userInfo:@"lyf" repeats:YES];
}//定時(shí)器函數(shù)
//可以將定時(shí)器本身作為參數(shù)傳入
-(void) updateTimer:(NSTimer*) timer
{ //userInfo為id類型NSLog(@"test!! name = %@", timer.userInfo);//tag最好從100開始UIView *view = [self.view viewWithTag:101];view.frame =CGRectMake(view.frame.origin.x+1, view.frame.origin.y+1, 80, 80);
}
//按下停止按鈕時(shí)調(diào)用
-(void) pressStop
{if (_timerVier != nil) {//停止定時(shí)器[_timerVier invalidate];}
}
@end
效果:
還有一點(diǎn)需要注意:如果對(duì)上述代碼連續(xù)點(diǎn)擊兩次啟動(dòng)定時(shí)器,此時(shí)再按停止定時(shí)器將無法停止視圖移動(dòng)。
原因:每次點(diǎn)擊都創(chuàng)造出一個(gè)定時(shí)器對(duì)象,從而使第一次點(diǎn)擊的定時(shí)器對(duì)象無法覆蓋。即無法再停止第一個(gè)定時(shí)器對(duì)象,只能停止新建立的定時(shí)器對(duì)象。
解決辦法:將該屬性變成單例模式,或者每次進(jìn)入pressStart時(shí),調(diào)用一遍結(jié)束方法。即:
- (void) pressStart
{[self pressStop];//每次調(diào)用前先關(guān)閉前一個(gè)定時(shí)器。_timerVier = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(updateTimer:) userInfo:@"lyf" repeats:YES];
}
五:UISwitch控件
UISwitch控件是蘋果官方庫提供的一個(gè)控件,與定時(shí)器相同,需要先在接口部分聲明一個(gè)屬性,在實(shí)現(xiàn)部分實(shí)現(xiàn)其具體功能。
但是,作為蘋果官方的控件,蘋果對(duì)其作出了一定的限制:如無法改變寬度高度值和設(shè)計(jì)樣式。
下例代碼詳細(xì)展示了該控件的使用:
#import "ViewController.h"@interface ViewController ()@end@implementation ViewController@synthesize mySwitch = _mySwitch;- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.//創(chuàng)建一個(gè)開關(guān)對(duì)象_mySwitch = [[UISwitch alloc] init];//蘋果官方的控件的位置設(shè)置//位置X,Y的值可以改變//寬度高度值是無法改變。系統(tǒng)默認(rèn)設(shè)置了_mySwitch.frame = CGRectMake(100, 100, 0, 0);//開關(guān)狀態(tài)設(shè)置屬性//YES:開啟狀態(tài)//NO:關(guān)閉狀態(tài)//_mySwitch.on = YES;//[_mySwitch setOn:YES];//設(shè)置開關(guān)狀態(tài)//P1:狀態(tài)設(shè)置//P2:是否開啟動(dòng)畫效果[_mySwitch setOn:YES animated:YES];[self.view addSubview:_mySwitch];//設(shè)置開啟狀態(tài)的風(fēng)格顏色[_mySwitch setOnTintColor:[UIColor orangeColor]];//設(shè)置開關(guān)圓按鈕的風(fēng)格顏色[_mySwitch setThumbTintColor:[UIColor blueColor]];//設(shè)置整體風(fēng)格顏色 沒作用原因已截圖[_mySwitch setTintColor:[UIColor redColor]];//向開關(guān)控件添加事件函數(shù)//P1:函數(shù)實(shí)現(xiàn)對(duì)象//P2:函數(shù)對(duì)象//P3:事件響應(yīng)時(shí)的事件類型UIControlEventValueChanged:狀態(tài)發(fā)生變化[_mySwitch addTarget:self action:@selector(swChange:) forControlEvents:UIControlEventValueChanged];
}
- (void) swChange:(UISwitch*) sw
{if (sw.on == YES) {NSLog(@"哈哈,打開咯");}else {NSLog(@"哈哈,關(guān)閉咯");}NSLog(@"我變質(zhì)了");
}@end
代碼結(jié)果:
六:滑動(dòng)條和進(jìn)度條
滑動(dòng)條與進(jìn)度條也需要在接口部分定義屬性,在實(shí)現(xiàn)部分實(shí)現(xiàn)功能。
除了對(duì)這兩個(gè)的基本使用,我們還可以實(shí)現(xiàn)用滑動(dòng)條來控制進(jìn)度條的長(zhǎng)短,當(dāng)滑動(dòng)條與進(jìn)度條不是相同長(zhǎng)度時(shí),我們可以使用下面的代碼來實(shí)現(xiàn)等比例控制。
pView.progress = (_slider.value - _slider.minimumValue) / (_slider.maximumValue - _slider.minimumValue);
ViewController.h
#import <UIKit/UIKit.h>@interface ViewController : UIViewController
{//進(jìn)度條對(duì)象//一般用來表示下載或者視頻播放的進(jìn)度UIProgressView * pView;//滑動(dòng)條定義//一般用來進(jìn)行調(diào)整音頻音樂的音量等UISlider *_slider;
}
//定義一個(gè)進(jìn)度條屬性
@property (retain, nonatomic) UIProgressView *pView;
//定義一個(gè)滑動(dòng)條屬性
@property (retain, nonatomic) UISlider *slider;
@end
ViewController.m
#import "ViewController.h"@interface ViewController ()@end@implementation ViewController@synthesize slider = _slider;
@synthesize pView = _pView;- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.//進(jìn)度條的創(chuàng)建pView = [[UIProgressView alloc] init];//進(jìn)度條的位置大小設(shè)置//進(jìn)度條的高度是不可以變化的.P4不可變pView.frame = CGRectMake(50, 100, 300, 40);pView.progressTintColor = [UIColor greenColor];pView.trackTintColor = [UIColor blackColor];//設(shè)置進(jìn)度條的進(jìn)度值//范圍從0-1//最小值為0,最大值為1pView.progress = 0;//設(shè)置進(jìn)度條的風(fēng)格特征pView.progressViewStyle = UIProgressViewStyleBar;[self.view addSubview: pView];//創(chuàng)建滑動(dòng)條對(duì)象_slider = [[UISlider alloc] init];//位置設(shè)置,高度不可變更_slider.frame = CGRectMake(10, 200, 300, 40);//設(shè)置滑動(dòng)條的最大值_slider.maximumValue = 100;//設(shè)置滑動(dòng)條的最小值,可以為負(fù)_slider.minimumValue = -100;//設(shè)置滑動(dòng)條的滑塊位置_slider.value = 0;//左側(cè)滑條背景顏色// _slider.minimumTrackTintColor = [UIColor blueColor];//右側(cè)滑動(dòng)條背景顏色_slider.maximumTrackTintColor = [UIColor greenColor];//設(shè)置滑塊顏色_slider.thumbTintColor = [UIColor orangeColor];[_slider addTarget:self action:@selector(pressSlider) forControlEvents:UIControlEventValueChanged];[self.view addSubview:_slider];
}-(void) pressSlider
{pView.progress = (_slider.value - _slider.minimumValue) / (_slider.maximumValue - _slider.minimumValue);NSLog(@"value = %f", _slider.value);
}@end
效果:
七:步進(jìn)器和分欄控件
先要在接口文件中定義步進(jìn)器對(duì)象和分欄控制器對(duì)象。
ViewController.h
#import <UIKit/UIKit.h>@interface ViewController : UIViewController
{//定義步進(jìn)器對(duì)象//按照一定的數(shù)字來調(diào)整某個(gè)數(shù)據(jù)UIStepper *_stepper;//分欄控制器定義UISegmentedControl *_segControl;
}@property (retain, nonatomic) UIStepper *stepper;
@property (retain, nonatomic) UISegmentedControl *segControl;@end
在.m文件中,我們不僅可以以文本來初始化分?jǐn)r控件,還可以以照片來初始化分?jǐn)r控件。
ViewController.m
#import "ViewController.h"@interface ViewController ()@end@implementation ViewController@synthesize stepper = _stepper;
@synthesize segControl = _segControl;- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view._stepper = [[UIStepper alloc] init];//只能設(shè)置位置,寬高不能改變_stepper.frame = CGRectMake(100, 100, 80, 40);//設(shè)置步進(jìn)器的最小值_stepper.minimumValue = 0;//設(shè)置步進(jìn)器的最大值_stepper.maximumValue = 100;//設(shè)置步進(jìn)器的當(dāng)前值,默認(rèn)值為0_stepper.value = 10;//設(shè)置步進(jìn)器每次向前或者向后步進(jìn)的步伐值_stepper.stepValue = 5;//是否可以重復(fù)響應(yīng)事件操作_stepper.autorepeat = YES;//是否將步進(jìn)結(jié)果通過事件函數(shù)響應(yīng)出來//不顯示中間過程,長(zhǎng)按直接顯示結(jié)果。_stepper.continuous = NO;//添加事件函數(shù)[_stepper addTarget:self action:@selector(stepChange) forControlEvents:UIControlEventValueChanged];[self.view addSubview:_stepper];_segControl = [[UISegmentedControl alloc] init];//寬度可變,高度不可變_segControl.frame = CGRectMake(10, 200, 300, 40);//添加一個(gè)按鈕元素[_segControl insertSegmentWithTitle:@"0元" atIndex:0 animated:NO];//參數(shù)一:按鈕選項(xiàng)文字//參數(shù)二:按鈕索引位置//參數(shù)三:是否有插入的動(dòng)畫效果[_segControl insertSegmentWithTitle:@"5元" atIndex:1 animated:NO];[_segControl insertSegmentWithTitle:@"10元" atIndex:2 animated:NO];// [_segControl insertSegmentWithTitle:@"30元" atIndex:0 animated:NO];//以照片作為分?jǐn)r控件的圖像。//注意要將照片放入當(dāng)前視圖內(nèi)。UIImage *image = [UIImage imageNamed:@"WechatIMG26890.jpg"];image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];[_segControl setImage:image forSegmentAtIndex:2];//當(dāng)前默認(rèn)按鈕索引設(shè)置_segControl.selectedSegmentIndex = 0;[_segControl addTarget:self action:@selector(segChange) forControlEvents:UIControlEventValueChanged];[self.view addSubview:_segControl];
}-(void) segChange
{NSLog(@"%d", _segControl.selectedSegmentIndex);
}-(void) stepChange
{NSLog(@"step press! value = %f", _stepper.value);
}@end
效果
代碼結(jié)果:
八:警告對(duì)話框和等待提示器
在遇到電量不足等特殊情況時(shí),可以彈出警告對(duì)話框提示用戶。
在下載或加載比較大的文件時(shí),可以顯示等待提示器提示用戶。
我們?cè)赩iewController 的接口文件中定義這兩個(gè)對(duì)象。
@interface ViewController : UIViewController
{//定義一個(gè)警告對(duì)話框視圖對(duì)象UIAlertController *_alertView;//等待提示對(duì)象//當(dāng)下載,或加載比較大的文件時(shí),可以顯示此控件,處于提示等待狀態(tài)UIActivityIndicatorView *_activityIndicator;
}@property (retain, nonatomic) UIAlertController *alertVier;
@property (retain, nonatomic) UIActivityIndicatorView *act;@end
在實(shí)現(xiàn)部分,我們先建立兩個(gè)按鈕,用來彈出提示器。
隨后開始實(shí)現(xiàn)這兩個(gè)提示器。
- 警告對(duì)話框
[UIAlertController alertControllerWithTitle:@"警告" message:@"你的手機(jī)已經(jīng)被劫持!!!" preferredStyle:UIAlertControllerStyleAlert];
使用如上代碼,設(shè)置樣式為彈出警告式的對(duì)話框。參一為標(biāo)題,參二為警告內(nèi)容。
UIAlertAction* action01 = [UIAlertAction actionWithTitle:@"打錢" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){/* 在這里編寫執(zhí)行該選項(xiàng)的代碼*/}];
隨后創(chuàng)建三個(gè)不同的action對(duì)象,如上所示參一為提示,參二為樣式,參三為需要執(zhí)行的代碼塊
樣式為以下四種:
- UIAlertActionStyleDefault:默認(rèn)樣式,用于表示用戶可以選擇的主要操作。
- UIAlertActionStyleCancel:取消樣式,通常用于取消操作,只能有一個(gè)取消按鈕。
- UIAlertActionStyleDestructive:破壞性樣式,用于表示執(zhí)行此操作可能有破壞性后果。
- UIAlertActionStyleTextInput:輸入樣式,允許用戶在彈出的警告框中輸入文本。
最后將操作對(duì)象加入到警告框中,再使該警告框顯示。
- 等待提示器
等待提示器的高度和寬度由蘋果官方設(shè)定,不可改變??梢栽O(shè)置四種不同風(fēng)格的等待指示器。
- UIActivityIndicatorViewStyleWhiteLarge:表示一個(gè)白色的大號(hào)等待提示器。
- UIActivityIndicatorViewStyleWhite:表示一個(gè)白色的普通大小等待提示器。
- UIActivityIndicatorViewStyleGray:表示一個(gè)灰色的普通大小等待提示器。
- UIActivityIndicatorViewStyleMedium:表示一個(gè)中等大小的等待提示器,通常是灰色的。
#import "ViewController.h"@interface ViewController ()@end@implementation ViewController@synthesize alertVier = _alertVier;
@synthesize act = _act;- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.for (int i = 0; i < 2; i++){UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];btn.frame = CGRectMake(100, 100 + 100 * i, 100, 40);if (i == 0){[btn setTitle:@"警告對(duì)話框" forState:UIControlStateNormal];} else if (i == 1) {[btn setTitle:@"等待指示器" forState:UIControlStateNormal];}btn.tag = 101 + i;[btn addTarget:self action:@selector(pressBtn:) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:btn];}}- (void)pressBtn:(UIButton*) btn {//警告對(duì)話框創(chuàng)建if (btn.tag == 101) {_alertView = [UIAlertController alertControllerWithTitle:@"警告" message:@"你的手機(jī)已經(jīng)被劫持!!!" preferredStyle:UIAlertControllerStyleAlert];UIAlertAction* action01 = [UIAlertAction actionWithTitle:@"打錢" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){/* 在這里編寫執(zhí)行該選項(xiàng)的代碼*/}];UIAlertAction* action02 = [UIAlertAction actionWithTitle:@"打錢" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action){/* 在這里編寫執(zhí)行該選項(xiàng)的代碼*/}];UIAlertAction* action03 = [UIAlertAction actionWithTitle:@"投降" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){/* 在這里編寫執(zhí)行該選項(xiàng)的代碼*/}];[_alertView addAction:action01];[_alertView addAction:action02];[_alertView addAction:action03];[self presentViewController:_alertView animated:YES completion:nil];} else if (btn.tag == 102){//寬度和高度不可改變_activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(100, 300, 80, 80)];//設(shè)定提示的風(fēng)格_activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleMedium;_activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleLarge;[self.view addSubview:_activityIndicator];//啟動(dòng)動(dòng)畫并顯示[_activityIndicator startAnimating];//停止動(dòng)畫并隱藏//[_activityIndicator stopAnimating];}
}@end
效果:
(點(diǎn)擊警告對(duì)話框)
(點(diǎn)擊等待指示器):
九:UITextField
先要在ViewController的接口部分中定義一個(gè)UITextField屬性,在接口部分實(shí)現(xiàn)。
作為一個(gè)文本控件,該控件只能輸入一行文本,不能輸入或顯示多行,常用來做登錄界面。
我們可以設(shè)置文本的大小,位置,邊框風(fēng)格和鍵盤風(fēng)格,字體的大小和顏色。此處主要介紹邊框風(fēng)格和鍵盤風(fēng)格
邊框風(fēng)格:
- UITextBorderStyleRoundedRect圓角風(fēng)格
- UITextBorderStyleLine線框風(fēng)格
- UITextBorderStyleBezel:bezel風(fēng)格
- UITextBorderStyleNone:無邊框風(fēng)格
鍵盤風(fēng)格(常用):
- UIKeyboardTypeDefault:默認(rèn)風(fēng)格
- UIKeyboardTypeNamePhonePad:字母和數(shù)字組合風(fēng)格
- UIKeyboardTypeNumberPad:純數(shù)字風(fēng)格
#import "ViewController.h"@interface ViewController ()@end@implementation ViewController@synthesize textField = _textField;- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.//設(shè)定一個(gè)文本輸入?yún)^(qū)對(duì)象self.textField = [[UITextField alloc] init];//設(shè)定文字輸入?yún)^(qū)的位置self.textField.frame = CGRectMake(100, 100, 180, 40);//設(shè)置textField的內(nèi)容文字self.textField.text = @"用戶名";//設(shè)置文字的字體大小self.textField.font = [UIFont systemFontOfSize:15];//設(shè)置字體的顏色self.textField.textColor = [UIColor blueColor];//設(shè)置邊框風(fēng)格//UITextBorderStyleRoundedRect圓角風(fēng)格//UITextBorderStyleLine線框風(fēng)格//UITextBorderStyleBezel:bezel風(fēng)格//UITextBorderStyleNone:無邊框風(fēng)格self.textField.borderStyle = UITextBorderStyleLine;//設(shè)置虛擬鍵盤風(fēng)格//UIKeyboardTypeDefault:默認(rèn)風(fēng)格//UIKeyboardTypeNamePhonePad:字母和數(shù)字組合風(fēng)格//UIKeyboardTypeNumberPad:純數(shù)字風(fēng)格self.textField.keyboardType = UIKeyboardTypeNumberPad;//提示文字信息//當(dāng)text屬性為空self.textField.placeholder = @"請(qǐng)輸入用戶名....";//是否作為密碼輸入//YES作為密碼加密,NO正常顯示self.textField.secureTextEntry = NO;[self.view addSubview:self.textField];
}- (void) textFieldDidBeginEditing:(UITextField *)textField
{NSLog(@"開始編輯了!");
}
-(void) textFieldDidEndEditing:(UITextField *)textField
{self.textField.text = @"";NSLog(@"編輯輸入結(jié)束了");
}//是否可以進(jìn)行輸入
//如果返回值為YES:可以進(jìn)行輸入,默認(rèn)為YES
//NO:不能輸入文字,無權(quán)限的時(shí)候
-(BOOL) textFieldShouldBeginEditing:(UITextField *)textField
{return YES;
}//是否可以結(jié)束輸入
//如果返回值為YES:可以結(jié)束輸入,默認(rèn)為YES
//NO:不能結(jié)束文字,輸入密碼位數(shù)不夠
-(BOOL) textFieldShouldEndEditing:(UITextField *)textField
{if (self.textField.text.length < 9) {return NO;} else {return YES;}
}//點(diǎn)擊屏幕空白處調(diào)用此函數(shù)
- (void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{//使虛擬鍵盤回收,不再做為第一消息響應(yīng)者[self.textField resignFirstResponder];
}@end
UITextField控件的四個(gè)協(xié)議:
開始編輯協(xié)議:手機(jī)鍵盤彈出瞬間調(diào)用
- (void) textFieldDidBeginEditing:(UITextField *)textField
結(jié)束編輯協(xié)議:手機(jī)鍵盤收回瞬間調(diào)用
-(void) textFieldDidEndEditing:(UITextField *)textField
是否可以進(jìn)行輸入
如果返回值為YES:可以進(jìn)行輸入,默認(rèn)為YES
NO:不能輸入文字
使用場(chǎng)景:無權(quán)限的時(shí)候使用
-(BOOL) textFieldShouldBeginEditing:(UITextField *)textField
是否可以結(jié)束輸入
如果返回值為YES:可以結(jié)束輸入,默認(rèn)為YES
NO:不能結(jié)束文字
使用場(chǎng)景:輸入密碼位數(shù)不夠
-(BOOL) textFieldShouldEndEditing:(UITextField *)textField
滾動(dòng)視圖
手機(jī)屏幕較小,通常情況下無法完全展示內(nèi)容,此時(shí)我們可以通過手勢(shì)來滾動(dòng)屏幕,達(dá)到移動(dòng)視圖的效果,而這個(gè)應(yīng)用就是滾動(dòng)視圖。
像我們常用的QQ聊天頁面,微信聊天頁面等,就是滾動(dòng)視圖的實(shí)際應(yīng)用。
滾動(dòng)視圖基礎(chǔ)
我們可以設(shè)置上下滾動(dòng)的視圖,也可以設(shè)置左右滾動(dòng)的視圖,對(duì)應(yīng)的畫布大小需要跟著改變。
滾動(dòng)視圖的創(chuàng)建在視圖控制器中進(jìn)行,即ViewController文件中進(jìn)行。
圖片的添加我們采用循環(huán)的方式簡(jiǎn)略。
#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.UIScrollView *sv = [[UIScrollView alloc] init];//設(shè)置滾動(dòng)視圖的位置,使用矩形來定位視圖位置sv.frame = CGRectMake(0, 0, 394, 852);//是否按照整頁來滾動(dòng)視圖sv.pagingEnabled = YES;//是否可以開啟滾動(dòng)效果sv.scrollEnabled = YES;//設(shè)置畫布的大小,畫布顯示在滾動(dòng)視圖內(nèi)部,一般大于Frame的大小sv.contentSize = CGSizeMake(394*6, 852*2);//是否可以邊緣彈動(dòng)效果sv.bounces = YES;//開啟橫向彈動(dòng)效果sv.alwaysBounceHorizontal = YES;//開啟縱向彈動(dòng)效果sv.alwaysBounceVertical = YES;//顯示橫向滾動(dòng)效果sv.showsHorizontalScrollIndicator = YES;//顯示縱向滾動(dòng)條sv.showsVerticalScrollIndicator = YES;//設(shè)置背景顏色sv.backgroundColor = [UIColor whiteColor];//使用循環(huán)創(chuàng)建5張圖片視圖for (int i = 0; i < 5; i++){NSString *strName = [NSString stringWithFormat:@"%d.jpg", i+1];UIImage *image = [UIImage imageNamed:strName];UIImageView *iView = [[UIImageView alloc] initWithImage:image];iView.frame = CGRectMake(394*i, 0, 394, 952);[sv addSubview:iView];}[self.view addSubview:sv];
}@end
滾動(dòng)視圖高級(jí)
滾動(dòng)視圖中還有一個(gè)協(xié)議叫UIScrollViewDelegate,這個(gè)協(xié)議可以讓我們實(shí)現(xiàn)更多控制效果。我們新建一個(gè)豎屏滾動(dòng)效果來學(xué)習(xí)這個(gè)協(xié)議的方法。
#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.scrollView = [[UIScrollView alloc] init];scrollView.frame = CGRectMake(10, 50, 384, 802);//取消彈動(dòng)效果scrollView.bounces = NO;//是否允許通過點(diǎn)擊屏幕讓滾動(dòng)視圖響應(yīng)事件//YES:滾動(dòng)視圖可以接受觸碰事件//NO:不接受觸屏事件//scrollView.userInteractionEnabled = NO;//設(shè)置畫布大小,縱向效果scrollView.contentSize = CGSizeMake(384, 802*9);for (int i = 0; i < 9; i++){//生成圖片名稱NSString *strName = [NSString stringWithFormat:@"%d.jpg", i+1];UIImage *image = [UIImage imageNamed:strName];UIImageView *iView = [[UIImageView alloc] init];iView.image = image;iView.frame = CGRectMake(0, 802 * i, 384, 802);[scrollView addSubview:iView];}[self.view addSubview:scrollView];//取消按頁滾動(dòng)效果scrollView.pagingEnabled = NO;//滾動(dòng)視圖畫布的移動(dòng)位置,偏移位置//功能:決定畫筆顯示的最終圖像結(jié)果scrollView.contentOffset = CGPointMake(0, 0);//將當(dāng)前視圖控制器作為代理對(duì)象scrollView.delegate = self;
}//當(dāng)滾動(dòng)視圖移動(dòng)時(shí),只要offset坐標(biāo)發(fā)生變化,都會(huì)調(diào)用此函數(shù)
//參數(shù):調(diào)用次協(xié)議的滾動(dòng)視圖對(duì)象
//可以使用此函數(shù)來監(jiān)控滾動(dòng)視圖的位置
//- (void) scrollViewDidScroll:(UIScrollView *)scrollView
//{
// NSLog(@"y = %f", scrollView.contentOffset.y);
//}- (void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{//scrollView.contentOffset = CGPointMake(0, 0);//讓滾動(dòng)視圖移動(dòng)到指定位置,動(dòng)畫移動(dòng)[scrollView scrollRectToVisible:CGRectMake(0, 0, 384, 802) animated:YES];
}//結(jié)束滑動(dòng)時(shí)調(diào)用
-(void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{NSLog(@"Did End Drag!");
}
//將要開始滑動(dòng)時(shí)調(diào)用
-(void) scrollViewWillBeginDragging:(UIScrollView *)scrollView
{NSLog(@"will Begin Drag");
}
//結(jié)束滑動(dòng)視圖后,準(zhǔn)備結(jié)束滑行調(diào)用該函數(shù)
-(void) scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{NSLog(@"Will End Drag!");
}
//準(zhǔn)備開始滑動(dòng)時(shí)調(diào)用該方法
-(void) scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
{NSLog(@"Will Begin Deceleratege!");
}
//停止滑動(dòng)時(shí)調(diào)用該方法
-(void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{NSLog(@"視圖停止移動(dòng)");
}
@end
注意:當(dāng)結(jié)束滑動(dòng)后,會(huì)有一個(gè)類似于慣性的滑動(dòng)效果,此時(shí)會(huì)調(diào)用不同的方法。
效果:
總結(jié)
多多學(xué)習(xí),多多思考。這篇博客的總結(jié)讓我加深了對(duì)UI控件的認(rèn)識(shí),并且熟練了很多UI控件的使用