视图添删、切换、显示以及坐标转换

1 视图添删

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


2 视图切换

基本切换  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];


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];
相关文章
相关标签/搜索