iOS中UIView之间布局及跳转的几种方式

UIView是iOS开发中所有视图的基类, 表示屏幕上的一块矩形区域, 同时可以处理该区域的绘制和触摸事件. UIViewController是视图控制器的基类, 用来处理屏幕之间的切换等操作, 提供视图管理模型. 一个UIViewController管理一个层级的UIView. 而RootViewController就是iOS应用启动时被载入的第一个视图控制器(可在main.storyboard中指定), 展示APP启动成功后的第一个界面. 因此, iOS中在各个UIViewController之间的切换操作显得尤为重要, 其直接决定了应用各个界面之间的切换效果. 主要的跳转方式有以下几种:

## UITabBarController

UITabBarController主要用于平级View的跳转, 应用案例如微信界面下方的四个Tab。可选中一个UIViewController, 在Xcode->Editor->Embed In-> Tab Bar Controller将其加入到一个Tab bar中. 也可以在storyboard中直接从UITabBarController中连线至一个View, 选择Relationship Segue的view controllers即可.

### property

tabbar里边包含的每一个viewController都对应一个tabbarItem, 位置都是均分的, 最多显示4个tab, 再多了就会折叠起来. 通过代码来设置tabbar的时候, 可以使用setViewControllers来添加指定的子ViewController为其item.

tabbarItem有title, image, selectedImage, badgeValue属性, badgeValue是该item右上角的提醒数字. 而selectedIndex和selectedViewController则定位到当前选取的tabbarItem.

除此之外, 还有viewControllers, selectedViewController, selectedIndex等属性, 含义就不罗嗦了.

### UITabBarControllerDelegate

该协议用于在选取某一个tabbarItem的时候, 执行一些额外的操作, 监控tabbar的改变, 也可以阻止某一个tabbarItem被选取.

## UINavigationController

### 堆栈式View管理

UINavigationController是IOS开发中常用的用于视图切换的控制器, 提供堆栈式的View管理方式, RootViewController在stack的最底层. 提供了诸多方法用于进行view之间的切换及管理等, 如

pushViewController与popViewController等. 详细内容, 可参考之前的一篇博客[UINavigationController的简单总结](http://blog.csdn.net/icetime17/article/details/42113591).

一般使用UINavigationController的方式, 会自动为我们设置好每个View界面的标题, 左上角的返回按钮, 以及屏幕右滑回退的操作. 如果想要禁止屏幕右滑返回等的手势操作, 可以在当前View的viewDidAppear方法中设置如下:

```swift

self.navigationController.interactivePopGestureRecognizer.enabled = NO; // 禁止右滑等手势

```

需要注意的是 UINavigationController是采用类似stack的push和pop的方式完成view的切换, 调用方法为pushViewController和popViewController. 而segue属性也要相应地设置为push.

使用viewControllers属性可以获取当前的视图栈.

### property

toolbarHidden是用于隐藏navigationController最上方的导航工具栏. 在该工具栏中, 我们可以自行添加各种Bar Button Item控件. 常见的是leftBarButtonItem和rightBarButtonItem.

UINavigationItem是该View栈中的每一项. 可以在Storyboard或xib文件中指定, 也可以自行代码创建, 然后加到UINavigationController中去即可.

### UINavigationControllerDelegate

该协议为NavigationController中的View跳转, 提供了很多遍历的方法.如: didShowViewController, willShowViewController, animationControllerForOperation等. 而枚举UINavigationControllerOperation中定义了View之间跳转的方式(None, Push, Pop).

## 使用nib文件

nib文件是一系列UIView的组合.

```swift

NSArray *arrayMessage = [[NSBundle mainBundle] loadNibNamed:@“ViewMessageCenter” owner:nil options:nil];

self.vMessageCenter = [arrayMessage objectAtIndex:0];

self.vMessageCenter.navigationController = self.navigationController;

self.vMessageCenter.frame = self.vMainPanel.bounds;

```

## 使用storyboard

将一个ViewController放在storyboard中, 然后调用instantiateViewControllerWithIdentifier, 加载一个storyboard文件中的对应ID的storyboard(一系列view的集合), 也是非常常用的一种方式.

```swift

UIStoryboard *sb = [UIStoryboard storyboardWithName:@“Main” bundle:nil];

LoginViewController *vc = [sb instantiateViewControllerWithIdentifier:@“LoginViewController”];

[self.navigationController popToRootViewControllerAnimated: YES];

[self.navigationController presentViewController: vc animated: YES completion:nil];

```

## 使用nib文件

Nib文件是一种特殊类型的资源文件, 保存Interface Builder文档, 可以进行可视化编辑.

每一个xib文件对应一个ViewController或者一个自定义的View, 可以使用loadNibNamed:方法来加载nib文件

```swift

NSArray *arrayMessage = [[NSBundle mainBundle] loadNibNamed:@“ViewMessageCenter” owner:nil options:nil];

self.vMessageCenter = [arrayMessage objectAtIndex:0];

self.vMessageCenter.navigationController = self.navigationController;

self.vMessageCenter.frame = self.vMainPanel.bounds;

```

## segue

对于两个单独的ViewController, 可以使用segue指定跳转方式.

如在storyboard中, 在VC1中的button上右键, 连线至第二个VC, 选择跳转方式即可实现两个VC之间的相互跳转.

如果想通过点击一个image, 实现VC的跳转呢? 这就要引入gesture了.

```objective-c

@property (weak, nonatomic) IBOutlet UIImageView *imageView;

```

View加载的时候设置手势:

```swift

self.imageView.userInteractionEnabled = YES;

UITapGestureRecognizer *imageTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageTapped)];

[self.imageView addGestureRecognizer:imageTap];

```

### 通过addSubView

如self.view.addSubView(newView) 即可直接加载UIView, 使用removeFromSuperview将该UIView移除.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容