1 视图添删
1>,移除某个视图
只是暂时从窗口移除,不是切地删除
[sender removeFromSuperview];
2>,添加视图或视图控制器
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>注意事项:
苹果文档强调,当控制器的view互为父子关系,那么它们的控制器也应该互为父子
当一个大控制器里面有很多个小控制器的view要显示的时候,就应该采用addChildViewController加入self,然后再讲控制器的view加入self.view。而非将子控制器强引用,然后直接将他们的view add到self.view中,这样很容易出错误。
- (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];
}
2 视图切换
基本切换
一 使用storyboard
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];
3 视图显示
使视图处于最高层,为了能触发响应事件
例子:弹出视图(弹出视图处于最高层,而且底下一层是蒙版)
// 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];
4 坐标转换
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];