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];