1>,移除某個視圖windows
只是暫時從窗口移除,不是切地刪除數組
[sender removeFromSuperview];
2>,添加視圖或視圖控制器ruby
addSubView:多用於添加控件,是添加在self.view的上面 addChildViewController:多用於添加控制器,是添加self的上面 //注意:子類不聲明self.superB addSubView:self.A,而是self.view addSubView:self.A // 那麼父類中必須聲明[self.A superView] 例子: - (UIImageView *)imageTom { if (_imageTom == nil) { UIImageView *imageTom = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; _imageTom = imageTom; [self.imageTom setImage:[UIImage imageNamed:@"eat_00.jpg"]]; [self.view addSubview:self.imageTom]; //必定要實現!!!!!!!!!! [self.eatCat superview]; } return _imageTom; } - (UIButton *)eatCat { if (_eatCat == nil) { UIButton *eatCat = [[UIButton alloc] initWithFrame: CGRectMake(self.imageTom.frame.origin.x+10, 400, 60, 60)]; _eatCat = eatCat; [self.eatCat setImage:[UIImage imageNamed:@"eat"] forState:UIControlStateNormal]; [self.eatCat setTag:10]; [self.eatCat addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:self.eatCat]; } return _eatCat; }
3>注意事項:ide
蘋果文檔強調,當控制器的view互爲父子關係,那麼它們的控制器也應該互爲父子spa
當一個大控制器裏面有不少個小控制器的view要顯示的時候,就應該採用addChildViewController加入self,而後再講控制器的view加入self.view。而非將子控制器強引用,而後直接將他們的view add到self.view中,這樣很容易出錯誤。
code
- (void)viewDidLoad { [super viewDidLoad]; //蘋果文檔強調,當控制器的view互爲父子關係,那麼它們的控制器也應該互爲父子 //經過addChildViewController添加一個子控制器,那麼這個控制器就會放到childViewController數組中,只要self在,childViewControllers數組就在,數組裏面的子控制就在 HMOneViewController *one = [[HMOneViewController alloc] init]; [self addChildViewController:one]; HMTwoViewController *two = [[HMTwoViewController alloc] init]; [self addChildViewController:two]; HMThreeViewController *three = [[HMThreeViewController alloc] init]; [self addChildViewController:three]; one.frame = ------------------------ two.frame = ------------------------ three.frame = ------------------------ } - (IBAction)vc1 { HMOneViewController *one = self.childViewControllers[0]; HMTwoViewController *two = self.childViewControllers[1]; HMThreeViewController *three = self.childViewControllers[2]; [two.view removeFromSuperview]; [three.view removeFromSuperview]; [self.view addSubview:one.view]; } - (IBAction)vc2 { HMOneViewController *one = self.childViewControllers[0]; HMTwoViewController *two = self.childViewControllers[1]; HMThreeViewController *three = self.childViewControllers[2]; [one.view removeFromSuperview]; [three.view removeFromSuperview]; [self.view addSubview:two.view]; } - (IBAction)vc3 { HMOneViewController *one = self.childViewControllers[0]; HMTwoViewController *two = self.childViewControllers[1]; HMThreeViewController *three = self.childViewControllers[2]; [two.view removeFromSuperview]; [one.view removeFromSuperview]; [self.view addSubview:three.view]; }
基本切換 orm
一 使用storyboardthree
1),直接在storyboard建立而且箭頭Navigation Conroller,連線便可事件
2),使用Segue跳轉內存
把界面縮小(你能夠在空白的地方雙擊一下,或者右鍵選擇縮放比例),此次咱們不是直接使用「按扭」鏈接界面,而是進行界面和界面之間的連線,以下圖所示:
注意:100%的縮放是不能進行界面和界面之間的連線!
以後的操做和前面的一致,爲了容易理解,我仍是貼一下圖:(直接用show鏈接)
選中「這條線」,在Storyboard Segue的Identifier指定一個標識符,後面咱們會用到:
這時咱們須要爲按扭添加一個事件,爲此須要同時顯示Storyboard和.m文件,操做以下:
建立事件的操做和以前連線的操做同樣:
爲這個事件建立一個名字,而後點擊Connect:
在事件裏添加以下代碼,把剛連線的Identifier傳進去,sender通常爲"self":
[self performSegueWithIdentifier:@"EasyCode" sender:self];
二 手動跳轉
1,push:依賴與UINavigationConroller,控制器切換是可逆的,好比A-->B B-->A [self.navigationController pushViewController:vc animated:YES]; 2,model:控制器是可逆的 [self presentViewController:vc animated:YES completion:nil]; 3,rootViewController:不可逆,切換會銷燬上一個控制器 UIWindow *window = [UIApplication sharedApplication].keyWindow; window.rootViewController = VC;
補充:
1>,頂端視圖,最上層
self.view.window 或 [UIApplication shareApplication].keyWindow;
這兩個相等,但推薦使用 [UIApplication shareApplication].keyWindow,由於其一啓動程序就會建立有值
而self.view.window在視圖加載時尚未值,要等到顯示纔會有
// 1.得到最上面的窗口,windows能夠是無限個 UIWindow *window = [[UIApplication sharedApplication].windows lastObject]; // 2.添加本身到窗口上 [window addSubview:self];
2>多控制器切換
自定義button實現類是UITabBarController視圖切換的效果注意事項
1,切換的控制器要強引用
不然,雖然窗口還能看見控制器的視圖,但其內的方法都實現不了或數據源加載不了。由於控制器被釋放了,但view被addsubview,因此還能看見。
2,懶加載控制器
用到的時候再加載,節省內存
3,當切換的時候,例如點擊button的方法,要removeFromSuperview其餘控制器的view,節省內存
4>prensnet modally的注意事項
prensnet modally:內部會對模態窗口進行強引用,必須調用隱藏模態窗口才能釋放內存
[self dismissViewControllerAnimated:NO completion:nil];
使視圖處於最高層,爲了能觸發響應事件
例子:彈出視圖(彈出視圖處於最高層,並且底下一層是蒙版) // 1.得到最上面的窗口 UIWindow *window = [[UIApplication sharedApplication].windows lastObject]; //蒙版 maskView = [[UIView alloc] init]; maskView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.6]; maskView.frame = window.bounds; [self.view addSubview:maskView]; //彈出視圖 insuranceUpload = [[InsuranceUpload alloc] init]; insuranceUpload.delegate = self; [insuranceUpload setCenter:CGPointMake(maskView.frame.size.width / 2, maskView.frame.size.height / 2)]; [maskView addSubview:insuranceUpload]; // 2.添加本身到窗口上 [window addSubview:maskView];
1,TtVC參考windows創建座標系 CGRect newFrame = [TtVC convertRect:TtVC.bounds toView:window]; 也能夠表示 CGRect newFrame = [TtVC convertRect:TtVC.bounds toView:nil]; nil表明屏幕 2,TtVC參考windows創建座標系 CGRect newFrame = [windows convertRect:windows.bounds fromView:TtVC];