課程要點:ios
建立一個iOS工程app
PS:接下來簡單介紹一下工程裏的文件與磁盤裏文件的對應關係框架
AppDelegate類函數
建立工程事後我們能夠看到系統給我們建立了不少以前我們沒有接觸過的類,但近一段時間我們只會用到AppDelegate類,其餘類以及文件你們目前不須要了解。之後會慢慢的告訴你們。學習
AppDelegate類在工程裏的做用相當重要,由於他管理着軟件的整個生命週期(例如這個軟件的啓動,結束,進入後臺,進入前臺等等)。每次軟件作不一樣的動做,就會調用AppDelegate.m相應的方法,我們在這些方法內作我們想作的操做就行。目前不須要理解AppDelegate裏的東西爲何要這樣寫。只要搞明白怎麼用就行。接下來是AppDelegate裏相應方法的調用時間。就目前而言我們經常使用的第一個- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法。其餘的可作了解。ui
// AppDelegate裏第一個進入系統的函數,應用程序完成初始化後調用。 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { return YES; } // 即將進入後臺 - (void)applicationWillResignActive:(UIApplication *)application { // 應用程序即將從活躍狀態切換到不活躍狀態這個函數(消息)就會被調用。這也會在某些臨時狀態發生(好比來了電話,SMS短信,這個函數也會被調用)或者 當用戶退出了應用程序,它開始切換到後臺模式 // 咱們應該作什麼?用這個方法咱們要作暫停正常運行的任務。關閉定時器,下降OpenGL ES的分辨率。暫停遊戲。 // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. //從應用程序到前臺(按Home後)或者鎖屏等等 NSLog(@"function %@ is calling",NSStringFromSelector(_cmd)); } // 已經進入後臺 - (void)applicationDidEnterBackground:(UIApplication *)application { // 用這個方法來釋放共享資源,保存用戶數據,做廢定時器,保存足夠多用戶狀態信息以便程序被終止,咱們下次還能恢復以前的狀態信息 // 若是你的應用程序支持後臺調用,當用戶退出應用程序(按Home鍵等)時這個方法就會被調用而不調用applicationWillTerminate消息 // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. NSLog(@"function %@ is calling",NSStringFromSelector(_cmd)); } // 即將切換到活躍狀態(前臺) - (void)applicationWillEnterForeground:(UIApplication *)application { // 若是從背景模式切換到不活躍狀態(前臺)時這個函數會被調用。在這裏能夠作一些和以前進入後臺相反的操做。恢復以前進入後臺保存的狀態 // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. NSLog(@"function %@ is calling",NSStringFromSelector(_cmd)); } // 已經進入活躍狀態(前臺) - (void)applicationDidBecomeActive:(UIApplication *)application { // 從新啓動被暫停的任務。若是應用程序在後臺,那麼這裏要刷新用戶界面(UI) // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. NSLog(@"function %@ is calling",NSStringFromSelector(_cmd)); } //終止調用函數(ios4.0不支持多任務,按Home鍵會調用這個函數殺死應用程序;ios4.0後按Home鍵將掛起應用程序這個函數就不會調用,若想調用就必須在plist給Application does not run in background鍵賦值TRUE) - (void)applicationWillTerminate:(UIApplication *)application { // 當應用程序中止時會調用這個函數,在適當狀況下保存數據。這個函數只有在<ios4.0時調用或者ios>4.0設置了不能後臺模式時 // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. NSLog(@"function %@ is calling",NSStringFromSelector(_cmd)); }
UIKit框架以及UIWindowthis
iOS:蘋果移動設備的操做系統 OS是mac的操做系統atom
UIKit->裏面包含了全部能夠看的見得視圖控件spa
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { /* * window : 在軟件內至關於一個平臺或者載體,他承載着軟件內全部的試圖。一個應用程序一般只有一個窗口,但也有例外。 * 做用: 它包含了應用程序的可視化的內容 它爲視圖和其餘應用程序對象在觸摸事件中提供了關鍵性的做用 它與視圖控制器一塊兒協做來呈現數據 */ //工程一建立完成,系統會自動會實例化一個window,只有設置了[self.window makeKeyAndVisible]; 才能在方法內給window添加試圖。 NSLog(@"自動建立的window=%@",self.window); //在控制檯能夠看到輸出的並非空,由此可驗證系統確實自動給生成了window對象 [self.window makeKeyAndVisible]; //如下三行代碼是建立一個紅色試圖並把他放在window上 UIView *view = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 200, 333)]; view.backgroundColor = [UIColor redColor]; [self.window addSubview:view]; return YES; }
運行後,模擬器截圖:操作系統
若我將 [self.window makeKeyAndVisible]; 給註釋掉,運行後,模擬器截圖:
PS:這個證實了若是沒有[self.window makeKeyAndVisible];,確實不能在AppDelegate.m中的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法裏給window添加試圖。
在window上添加第一個試圖UIView
/* * 創將一個試圖並將試圖放到window上的最基本三步走。 一、建立一個試圖對象 二、告訴系統你要將這個試圖對象放在父試圖的哪一個位置,以及這個試圖對象的寬高 三、告訴系統這個試圖對象的父試圖是誰。 * PS:這三步是必不可少的。切記 */ //建立一個試圖對象 UIView *view = [[UIView alloc]init]; //告訴系統你要將這個試圖對象放在父試圖的哪一個位置,以及這個試圖對象的寬高。
/*
* frame: 這個屬性,用來肯定試圖對象的x,y,寬,高。frame他是CGRect類型,CGRect裏存放在這四個元素。
* CGRect: 這是一個結構體,內容以下:
struct CGRect {
CGPoint origin;
CGSize size;
};typedef struct CGRect CGRect;
* CGPoint:這也是一個結構體,用來肯定試圖對象的x,y,內容以下:
struct CGPoint {
CGFloat x;
CGFloat y;
};typedef struct CGPoint CGPoint;
* CGSize:一樣是一個結構體,用來確實試圖對象的寬和高,內容以下:
struct CGSize {
CGFloat width;
CGFloat height;
};typedef struct CGSize CGSize
*/
//除了有
view.frame = CGRectMake(100, 100, 200, 333);
//告訴系統這個試圖對象的父試圖是誰。經過addSubView將view放到了self.window中
[self.window addSubview:view];
/* * UIView的經常使用屬性 * backGroundColor:背景顏色 * alpha:透明度 * subViews:子試圖集合 子試圖:就是說放在view上面的試圖就都叫作他的子試圖,子試圖能夠有多個。人能夠有多個子女。 * hidden:是否隱藏 * tag:標籤值 * superview:父試圖 父試圖:就是承載view的那個試圖,一個試圖只有一個父試圖。人只有一個父親。 * multipleTouchEnabled:是否開啓多點觸摸 * userInteractionEnabled:是否響應觸摸事件 * PS:目前前六種必須所有掌握,後兩種,目前不經常使用,但必須知道是什麼意思。 */ //backGroundColor view.backgroundColor = [UIColor redColor]; //透明度 0是徹底透明 1是徹底不透明 view.alpha = 0.5f; //子試圖集合 由此得到放在view上的全部試圖 NSArray *viewArray = [view subviews]; NSLog(@"放在view上的試圖有%ld個",viewArray.count); NSArray *windowArray = [self.window subviews]; NSLog(@"放在self.window上的試圖有%ld個",windowArray.count); //PS:輸出self.window的子試圖時,會有兩個,一個是我們建立的試圖,而另外一個就是window上自帶的一個試圖,就比如桌子上的桌布。 //hidden YES就隱藏,NO就不隱藏 view.hidden = YES; view.hidden = NO; //tag 標籤值,給一個試圖設置標籤值咱就能夠經過標籤值來尋找一個試圖 view.tag = 888; for (UIView *view in self.window.subviews) { if (view.tag == 888) { NSLog(@"找到了我標記的試圖=%@",view); } } //superview 找到該試圖的父試圖 NSLog(@"view的父試圖是%@",[view superview]);
UIView的經常使用方法:
//將視圖從父視圖中移除 - (void)removeFromSuperview [self.lblTest removeFromSuperview]; //插入一個視圖到指定位置 - (void)insertSubview:(UIView *)view atIndex:(NSInteger)index
NSInteger myIndex = 0; if(self.myView1.subviews.count>0) { myIndex = self.myView1.subviews.count; } [self.myView1 insertSubview:self.lblTest atIndex:myIndex]; //將index1和index2位置的兩個視圖互換位置 - (void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2 NSInteger index1 = [self.view.subviews indexOfObject:self.lblTest1]; NSInteger index2 = [self.view.subviews indexOfObject:self.lblTest2]; [self.view exchangeSubviewAtIndex:index1 withSubviewAtIndex:index2]; //添加子視圖 - (void)addSubview:(UIView *)view [self.myView1 addSubview:self.lblTest]; //插入視圖到指定位置 - (void)insertSubview:(UIView *)view atIndex:(NSInteger)index [self.view insertSubview:self.lblTest atIndex:0]; //插入視圖到指定視圖的下面 - (void)insertSubview:(UIView *)view belowSubview:(UIView *)siblingSubview [self.view insertSubview:self.lblTest1 belowSubview:self.lblTest2]; //插入視圖到指定視圖的上面 - (void)insertSubview:(UIView *)view aboveSubview:(UIView *)siblingSubview [self.view insertSubview:self.lblTest1 aboveSubview:self.lblTest2]; //將指定子視圖移到最頂層 - (void)bringSubviewToFront:(UIView *)view [self.view bringSubviewToFront:self.lblTest]; //將指定子視圖移到最底層 - (void)sendSubviewToBack:(UIView *)view [self.view sendSubviewToBack:self.lblTest]; //根據視圖的tag查找視圖 - (UIView *)viewWithTag:(NSInteger)tag [self.lblTest setTag:5]; [self.view viewWithTag:5].alpha = 0; //取得視圖下的全部子視圖 @property(nonatomic, readonly, copy) NSArray *subviews NSArray *arrView = [self.view subviews]; for (UIView *view1 in arrView) { NSLog(@"%@",view1); }
PS:以前我們說過OC是一門面向對象的語言,爲何要面向對象呢,由於對象本身可以實現一些功能,好比如今咱們學的試圖,我們給一個座標就能本身找到位置,給什麼個顏色就能本身把本身染成什麼顏色。這即是面向對象的一種體現。
NSTimer(定時器)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { /* * NSTimer:定時器 * intervarl: 設置定時時間 * target:接收時間到了誰來接收這個信號 * selector: 時間到了要作什麼 * userInfor:要傳入的參數,通常置nil * repeats: 是否重複 YES重複 NO不重複 */
// 若是此時@selector(start:),start後面有冒號(有冒號就表明這個方法有參數),實現的時候咱就用- (void)start:(NSTimer *)timer,不然- (void)start;
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(start:) userInfo:@"時間到" repeats:YES]; //讓定時器當即調用指定方法 // [timer fire]; // //釋放這個定時器// [timer invalidate]; // // //開啓定時器 // timer.fireDate = [NSDate distantPast]; // //關閉定時器 // timer.fireDate = [NSDate distantFuture]; return YES; }
//在設置定時器的時候,這個方法已經用@selector聲明過了,若是此時你不把他實現,運行就會奔潰。
- (void)start:(NSTimer *)timer
{
NSLog(@"%@",[timer userInfo]);
}
以上是我的看法,如有錯誤歡迎指正,在學習中如有不理解歡迎騷擾 QQ:2314858225