視圖添刪、切換、顯示以及座標轉換

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];
相關文章
相關標籤/搜索