首要的第一步是瞭解iPhone應用程序的聲明週期和它的界面分佈情況,UIApplication和UIView相關知識是iPhone應用程序開發基礎。
1.UIWindow和UIView:
在iOS平臺上運行的程序都有一個UIApplication類的對象,UIApplication類繼承於UIResponder類,它是iOS應用程序的起點,負責初始化和顯示UIWindow,還接收事件,通過委託"UIApplicationDelegate"來處理,此外就是幫助管理應用程序的生命週期。
UIKit框架是應用程序的基礎,它通過main和UIApplicationMain進行對用戶界面的管理/事件的管理及應用程序整體的運行管理。當進入到應用程序後,main函數和UIApplicationMain函數相繼執行,然後通過初始化窗口信息來載入應用程序的主窗口,接着會處理響應事件。
應用程序的狀態:
- Not Running(未運行) :程序沒有啓動;
- Inactive(未激活):程序在前臺運行,但沒有收到事件;
- Active(激活):程序在前臺運行,而且接收到事件;
- Background(後臺):續程在後臺但能執行代碼;
- Suspended(掛起):程序在後臺不能執行代碼。
UIKit | 程序代碼 |
---|---|
用戶單擊應用程序圖標 | |
main函數被執行 | |
UIApplication Main函數被執行 |
ApplicationDidLaunching WithOptions: |
響應事件 | 處理事件 |
是否從前臺推出 |
ApplicationWillResignActive: |
應用程序移到後臺 | ApplicationDidEnterBackground |
UIApplication主要任務是處理用戶事件,它創建一個隊列,將所有用戶事件都放入隊列中。在處理過程中,它會發送當前事件到一個合適處理事件的控件。即UIApplication類不具體實現某項功能,只負責監聽事件,當需要實際完成工作時,就將工作分配給UIApplicationDelegate去完成,而在UIApplicationDelegate中定義了許多協議需要實現,這些協議中定義好方法就是UIApplication對象監聽到系統變化的時候通知UIApplication對象代理類執行的相應方法。
- 在應用程序將要進入到非活動狀態時執行,在此期間程序不接受消息(類似Android中activity的onCreate()這個方法是啓動activity首先執行)
-(void)applicationWillResignActive:(UIApplication *)application
- 在應用程序將要進入活動狀態時執行。(類似Android中activity的onResume()此方法在進入可視狀態,不接受事件的處理。或者是onReStart()方法)
-(void)applicationDidBecomeActive:(UIApplication *)application
- 執行此方法可以進行內存清理以防止程序被太多內存所佔用而導致程序執行終止。(類似Android中activity的onDestory()方法在銷燬activity時進行的操作方法)
-(void)applicationDidReceiveMemoryWarning:(UIApplication *)application
- 此方法的功能時在程序載入後可以執行一些用戶需要的操作。
-(void)applicationDidFinishLaunching:(UIApplication *)application
- 此方法是程序被推送到後臺時調用。(類似Android中activity的onPause()方法,可視狀態,但不可接受事件處理。或onStop()方法)
-(void)applicationDidEnterBackground:(UIApplication *)application
2 .窗口和視圖:
在iOS應用程序中一般只有一個窗口,表示爲一個UIWindow類,iOS是單窗口多視圖的一個系統。UIWindow類一個應用程序最爲基礎的類,就像一個畫布,UIWindow就是最底層的畫布,我們需要做的就是往窗口中加入各種視圖。UIWindow其實就是一個視圖,因爲它的父類是UIView。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//創建窗口
// self.viewController = [[ViewController alloc] initWithNibName: @"ViewController" bundle: nil];
// self.window.rootViewController;
self.window = [[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]] autorelease];
NSArray *windows = [[UIApplication sharedApplication] windows];
for(UIWindow *window in windows) {
if(window.rootViewController == nil){
UIViewController *vc = [[UIViewController alloc]initWithNibName:nil bundle:nil];
window.rootViewController = vc;
}
}
// self.window.backgroundColor = [UIColor cyanColor];
[self.window makeKeyAndVisible];
//創建視圖
UIView *baseView = [[UIView alloc]initWithFrame:CGRectMake(10, 50, 300, 400)];
baseView.backgroundColor = [UIColor redColor];
[self.window addSubview:baseView];
[self.window release];
[self.window makeKeyAndVisible];
return YES;
}
應喲個程序在載入時,系統就創建一個UIWindow窗口作爲基本的窗口,並設置了它的尺寸等於物理設備尺寸,通過[[UIScreen mainScreen] bounds]這條語句能獲得不同設備當前的屏幕尺寸,可以通用於多種設備之間,最後讓窗口顯示在屏幕上。不必考慮對窗口的操作,因爲一般的操作都建立在視圖上,但要了解窗口和視圖之間的框架結構關係。
視圖是UIView類的實例,它負責在屏幕上繪製一個矩形區域。視圖的作用主要體現在用戶界面的顯示及相應用戶界面交互上。UIView有父視圖(superview)和子視圖(subview)屬性,通過定義這兩個屬性,可以建立視圖之間的層次關係,並且這兩個屬性還關係到視圖座標的確定。
- CGPoint{x,y} 代表了所在視圖的座標信息;
- CGSize{width,height} 代表了所在視圖的大小信息;
- CGRect{origin,size} 代表所在視圖的座標(視圖左上角的點)信息和大小信息,還有3個於之對應的函數;
- CGPointMake{x,y} 聲明瞭位置信息;
- CGSizeMake(width,height) 聲明瞭位置信息和大小信息;
- CGRectMake{x,y,width,height} 聲明瞭位置和大小信息。
3.iOS座標系統:
在使用UIView時,視圖的座標位置是一個很重要的信息,iOS中描述視圖的座標位置有三個屬性分別是frame/bounds和center。
- frame:用來描述當前視圖在父視圖中的座標位置和大小;
- bounds:用來描述當前視圖在其自身座標系統中的位置和大小;
- center:用來描述當前視圖在的中心點在父視圖中的位置。
4.視圖的層次關係及常用屬性:
UIView層次結構堪稱數據結構中的樹型結構,一個視圖可以有多個子視圖,但是隻能有一個父視圖(基視圖)。在添加子視圖時,最後添加的視圖會顯示在最頂層。
- 添加和移除子視圖:[UIView addSubview:subView]
[UIView addSubview:subView];
[subView release];
- 前移和後移視圖:[UIView bringSubviewToFront:subview],命令將特定視圖移到頂層。父視圖管理子視圖過程中,是通過一個有序的數組存儲它的子視圖,因此,數組存儲的順序會影響到子視圖的顯示效果。
- 獲取視圖的index值:對多個視圖進行操作,首先要獲取各個視圖的index值;:
NSInterger index = [[UIView subViews]indexOfObject:Subview];
[View insertSubview:subviewAtIndex:0]; //將視圖添加到特定的視圖上
- 獲取所有視圖信息:父視圖可以通過[view1 subviews]將view1子視圖的信息以數組的形式輸出。
- 設置tag值對視圖進行操作:通過設置視圖的tag值,可以標記視圖對象(整數),它能使用viewWithTag方法來更方便地對視圖進行操作。Tag值的默認值是0,可以通過view.tag設置。clipsTobounds屬性是將子視圖超出父視圖的範圍隱藏起來,他默認是no。“view.clipsTobounds = YES”顯示超出部分;alpha屬性是透明度;hidden屬性是否隱藏視圖。
//
// ViewController.m
// MyFristIos
//
// Created by 王耀 on 2019/6/13.
// Copyright © 2019 王耀. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
NSLog(@"ViewController添加textview");
UIView *viewChange1 = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 120, 160)];
viewChange1.tag = 1;
viewChange1.backgroundColor = [UIColor yellowColor];
[self.view addSubview:viewChange1];
UIView *viewChange2 = [[UIView alloc]initWithFrame:CGRectMake(110, 150, 100, 50)];
viewChange2.tag = 2;
viewChange2.backgroundColor = [UIColor blueColor];
[self.view addSubview:viewChange2];
//創建改變視圖層次按鈕1
UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button1.frame = CGRectMake(120, 270, 100, 30);
button1.backgroundColor = [UIColor whiteColor];
[button1 setTitle:@"view1 top" forState:UIControlStateNormal];
[button1 addTarget:self action:@selector(ViewChange1) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button1];
//創建改變視圖層次按鈕2
UIButton *button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button2.frame = CGRectMake(120, 320, 100, 30);
button2.backgroundColor = [UIColor whiteColor];
[button2 setTitle:@"view2 top" forState:UIControlStateNormal];
[button2 addTarget:self action:@selector(ViewChange2) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button2];
//創建改變視圖顏色的按鈕3
UIButton *button3 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button3.frame = CGRectMake(120, 370, 100, 30);
button3.backgroundColor = [UIColor whiteColor];
[button3 setTitle:@"change color" forState:UIControlStateNormal];
[button3 addTarget:self action:@selector(ViewChange3) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button3];
}
-(void) ViewChange1
{
UIView *view = [self.view viewWithTag:1];
[self.view bringSubviewToFront:view];
}
-(void) ViewChange2
{
UIView *view = [self.view viewWithTag:2];
[self.view bringSubviewToFront:view];
}
-(void) ViewChange3
{
UIView *view = [self.view viewWithTag:2];
view.backgroundColor = [UIColor greenColor];
}
@end
5.UIView中的layer屬性:
在UIView視圖上進行各種可視化的操作,以達到用戶所需的效果。在UIView中有一個layer屬性,每一個視圖都有一個layer屬性。真正繪圖的部分是由CALayer類來完成的,UIView的功能是CALayer的管理容器,在訪問UIView中與繪圖/座標有關的屬性時,其實時訪問了它的管理的CALayer的相關屬性。在使用CALayer之前需要將QuartzCore.framework框架引入項目中。
UIView主要時用於對顯示內容的管理,而CALayer則側重於對內容的繪製。
-(void) viewDidLoad1
{
UIView *baseView = [[UIView alloc]initWithFrame:CGRectMake(120, 500, 300, 120)];
baseView.backgroundColor = [UIColor blueColor];
[self.view addSubview:baseView];
//設置視圖的layer屬性
baseView.layer.backgroundColor = [UIColor orangeColor].CGColor;
baseView.layer.cornerRadius = 20.0f;
//創建子layer層
CALayer *Mylayer = [CALayer layer];
Mylayer.frame = CGRectMake(50, 700, 200, 100);
Mylayer.backgroundColor = [UIColor redColor].CGColor;
Mylayer.cornerRadius = 10.0f; //設置圓角切值
[baseView.layer addSublayer:Mylayer];
}
6.內容模式屬性(ContenMode):
ConentMode(內容模式)用來設置視圖的顯示的方法,如居中/向左對齊/縮放等,它是一個枚舉類型的數據裏面有許多常量。要設置視圖屬性,則可以通過view.ContentMode來時止,選擇屬性的時候可以按住“Command”鍵進入API接口進行選擇。
typedef NS_ENUM(NSInteger, UIViewContentMode) {
UIViewContentModeScaleToFill,
UIViewContentModeScaleAspectFit, // contents scaled to fit with fixed aspect. remainder is transparent
UIViewContentModeScaleAspectFill, // contents scaled to fill with fixed aspect. some portion of content may be clipped.
UIViewContentModeRedraw, // redraw on bounds change (calls -setNeedsDisplay)
UIViewContentModeCenter, // contents remain same size. positioned adjusted.
UIViewContentModeTop,
UIViewContentModeBottom,
UIViewContentModeLeft,
UIViewContentModeRight,
UIViewContentModeTopLeft,
UIViewContentModeTopRight,
UIViewContentModeBottomLeft,
UIViewContentModeBottomRight,
};