分割控制器UISplitViewController
<1>功能:它也是ipad的一个新特性,在屏幕上可以同时显示两个控制器,左边一个,右边一个;左边的为主控制器,右边的为详细控制器,主控制器可以根据需要显示或隐藏。它对于iPhone虽然可以使用,但是不具备同时显示的特点,在iPhone的样式,就是导航控制器切换的模式。
 
<2>介绍
Split View通常只是一个基本元素,它填满整个屏幕,不可能把Split View放到其他什么的内部,一般情况下是提供给整个app的。
Split View有两个ViewControllers,一个左侧一个右侧,左侧叫Master,右侧叫Detail。
SplitViewController有 一个property叫做ViewControllers,它是一个数组,这个数组有两个元素,左侧和右侧,左侧是元素0,右侧是元素1
@property (nonatomic, copy) NSArray *viewControllers;
 
 
<3>代理方法:Split View不能没有delegate,如果没有设置delegate,那么当Split View进入Portrait模式的时候左侧就会消失,你应该在角落里放一个小按钮,使用户可以点击它来让左侧出现
- (BOOL)splitViewController:(UISplitViewController *)sender

shouldHideViewController:(UIViewController *)master inOrientation:(UIInterfaceOrientation)orientation

{

return YES; // always hide it

}

- (BOOL)splitViewController:(UISplitViewController *)sender shouldHideViewController:(UIViewController *)master   inOrientation:(UIInterfaceOrientation)orientation

{

return UIInterfaceOrientationIsPortrait(orientation); //竖屏时隐藏master

}

-(void)splitViewController:(UISplitViewController *)sender  willHideViewController:(UIViewController *)master   withBarButtonItem:(UIBarButtonItem *)barButtonItem  forPopoverController:(UIPopoverController *)popover

{

//将要隐藏master时,在detail控制器的toolbar上设置并显示一个按钮

barButtonItem.title = @“Master”;

[detailViewController setSplitViewBarButtonItem:barButtonItem];

}

-(void)splitViewController:(UISplitViewController *)sender willShowViewController:(UIViewController *)master   invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem

{

// removeSplitViewBarButtonItem: must remove the bar button from its toolbar

[detailViewController removeSplitViewBarButtonItem:nil];

}

<4>在iPad上的基本样式截图为:

<5>在故事板布局的样式截图为:

下面我们就通过纯代码的方式创建如下:

1、创建两个控制器类,一个为主控制器类MasterViewController,一个为详细控制器类DetailViewController

2、导入几张素材图片,用来在详细控制器中显示。所有的文件截图为:

3、下面就是具体的代码创建了:

//在AppDelegate.m文件中:

导入头文件并声明必要的属性,同时实现分割控制器的协议

#import "AppDelegate.h"
#import "MasterViewController.h"
#import "DetailViewController.h"
@interface AppDelegate ()<UISplitViewControllerDelegate>
@property (strong,nonatomic)UISplitViewController *splitViewController; //声明分割控制器
@end

创建分割控制器、主控制器、详细控制器,并设置它们之间的关系,以及设置分割控制器的代理

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    //创建分割控制器
self.splitViewController = [[UISplitViewController alloc]init]; //创建MasterVC
MasterViewController *MasterVC = [[MasterViewController alloc]init]; //创建DetailVC
DetailViewController *DetailVC = [[DetailViewController alloc]init]; //创建左侧导航控制器
UINavigationController *MasterNavigationController = [[UINavigationController alloc]initWithRootViewController:MasterVC]; //创建右侧导航栏控制器
UINavigationController *DetailNavigationController = [[UINavigationController alloc]initWithRootViewController:DetailVC]; // 设置 UISplitViewController 所管理的左、右两个 UIViewController
self.splitViewController.viewControllers = @[MasterNavigationController,DetailNavigationController]; //设置分割控制器分割模式
self.splitViewController.preferredDisplayMode = UISplitViewControllerDisplayModePrimaryHidden; //设置代理
self.splitViewController.delegate = self; //设置window的根控制器
self.window.rootViewController = self.splitViewController; return YES;
}

实现分割控制器协议的方法

#pragma mark -<UISplitViewController>
//主控制器将要隐藏时触发的方法
-(void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc
{
barButtonItem.title = @"Master";
//master将要隐藏时,给detail设置一个返回按钮
UINavigationController *Nav = [self.splitViewController.viewControllers lastObject];
DetailViewController *Detail = (DetailViewController *)[Nav topViewController]; Detail.navigationItem.leftBarButtonItem = barButtonItem;
} //开始时取消二级控制器,只显示详细控制器
- (BOOL)splitViewController:(UISplitViewController *)splitViewController collapseSecondaryViewController:(UIViewController *)secondaryViewController ontoPrimaryViewController:(UIViewController *)primaryViewController
{
return YES;
} //主控制器将要显示时触发的方法
-(void)splitViewController:(UISplitViewController *)sender willShowViewController:(UIViewController *)master invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
//master将要显示时,取消detail的返回按钮
UINavigationController *Nav = [self.splitViewController.viewControllers lastObject];
DetailViewController *Detail = (DetailViewController *)[Nav topViewController]; Detail.navigationItem.leftBarButtonItem = nil;
}

//在MasterViewcontroller.m文件中:

导入头文件并声明必要的属性,同时实现分割控制器的协议

#import "MasterViewController.h"
#import "DetailViewController.h" @interface MasterViewController ()<UITableViewDataSource,UITableViewDelegate>
@property(strong,nonatomic)UITableView *tableView; //表格视图
@property (strong,nonatomic)NSMutableArray *dataObjects; //文字数据
@property (strong,nonatomic)NSMutableArray *imageArrayM; //图像数据
@end

创建主控制器Master的导航栏和按钮,并设置表格视图的数据源和代理

- (void)viewDidLoad {
[super viewDidLoad]; //创建UITableView
self.tableView = [[UITableView alloc]initWithFrame:self.view.frame style:UITableViewStylePlain]; //创建数组
self.dataObjects = [NSMutableArray arrayWithObjects:@"美女0",@"美女1",@"美女2",nil];
self.imageArrayM = [NSMutableArray arrayWithObjects:[UIImage imageNamed:@"美女0.jpg"],[UIImage imageNamed:@"美女1.jpg"],[UIImage imageNamed:@"美女2.jpg"],nil]; //设置数据源和代理
self.tableView.dataSource = self;
self.tableView.delegate = self; [self.view addSubview:self.tableView]; //设置主控制器Master的导航栏和按钮
self.navigationItem.title = @"Master";
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:nil];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:nil];
}

实现表格视图的数据源协议方法

#pragma mark -<UITableViewDataSource>
//多少行
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.dataObjects.count;
}
//设置每一个单元格的内容
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//1.根据reuseIdentifier,先到对象池中去找重用的单元格对象
static NSString *reuseIdentifier = @"Cell";
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
//2.如果没有找到,自己创建单元格对象
if(cell == nil)
{
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
}
//3.设置单元格对象的内容
cell.textLabel.text = [self.dataObjects objectAtIndex:indexPath.row];
return cell;
}

实现表格视图的代理协议方法

#pragma mark -<UITableViewDelegate>
//选中单元格时,设置详细控制器中的内容
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//获取详细控制器
UINavigationController *detailNAV = [self.splitViewController.viewControllers lastObject];
DetailViewController *detatilVC = (DetailViewController*)[detailNAV topViewController]; //创建图像视图
UIImageView *imageView = [[UIImageView alloc]initWithFrame:detatilVC.view.frame];
[imageView setImage:[self.imageArrayM objectAtIndex:indexPath.row]]; [detatilVC.view addSubview:imageView];
}

//在DEtailViewController.m文件中

设置视图背景颜色

- (void)viewDidLoad {
[super viewDidLoad];
//设置视图颜色为白色
[self.view setBackgroundColor:[UIColor whiteColor]];
}

演示结果如下:

开始时:

点击Master,显示Master主控制器:

点击单元格时,Detail详细控制器显示的内容:

点击屏幕,关闭Master主控制器:

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!

UISplitViewController使用的更多相关文章

  1. UISplitViewController - iPad分屏视图控制器

    UISplitViewController - 分屏视图控制器 概述 UISplitViewController 是一个容器vc, 展示一个 master-detail(主-详(从))界面. 主视图改 ...

  2. iOS - UISplitViewController

    前言 NS_CLASS_AVAILABLE_IOS(3_2) @interface UISplitViewController : UIViewController @available(iOS 3. ...

  3. iOS:分割控制器UISplitViewcontroller

    分割控制器UISplitViewController <1>功能:它也是ipad的一个新特性,在屏幕上可以同时显示两个控制器,左边一个,右边一个:左边的为主控制器,右边的为详细控制器,主控 ...

  4. iOS:iPad和iPhone开发的异同(UIPopoverController、UISplitViewController)

    iPad和iPhone开发的异同 1.iPhone和iPad: niPhone是手机,iPad.iPad Mini是平板电脑 iPhone和iPad开发的区别 屏幕的尺寸 \分辨率 UI元素的排布 \ ...

  5. 分割视图控制器(UISplitViewController) 改_masterColumnWidth 导致在 IOS 10中出现闪退

    默认UISplitViewController的Master和Detail的宽度是固定的,可以通过下面的方式来改变 [splitViewController setValue:[NSNumber nu ...

  6. 分割视图控制器(UISplitViewController)

    这种控制器只能用于iPad,它可以在iPad屏幕中显示两个不同的场景:在横向模式下,左边显示一个表,供用户选择:用户选择表中的元素后,详细视图将显示该元素的详细信息.如果iPad被旋转到纵向模式,表将 ...

  7. UISplitViewController

    前言 大多数时候,iPhone.iPod 应用与 iPad 应用开发没有太大的区别,但是 iPad 的屏幕比 iPhone 大, 设计程序时可以充分利用 iPad 的大屏幕特点,例如 TabBar 和 ...

  8. ios之UISplitViewController

    iPad的屏幕比iPhone大,所以在界面上,iPad比iPhone多一个UISplitViewController,用来实现iPad在横屏时,分两栏显示所需要的界面,可以一边是目录一边是具体的内容. ...

  9. iOS Programming UISplitViewController

    iOS Programming UISplitViewController  The iPad, on the other hand, has plenty of screen space to pr ...

随机推荐

  1. NOIP2017普及组初赛试题及答案

    普及组C++语言试题 一.单项选择题(共 20 题,每题 1.5 分,共计 30 分:每题有且仅有一个正确选项) 1.在 8 位二进制补码中,10101011 表示的数是十进制下的( ). A. 43 ...

  2. INotifyPropertyChanged 接口

    INotifyPropertyChanged 接口 用于向客户端(通常是执行绑定的客户端)发出某一属性值已更改的通知. 例如,考虑一个带有名为 FirstName 属性的 Person 对象.若要提供 ...

  3. web中cookie的使用

    一:cookie在浏览器中什么地方查找写入成功 二:如何用js写 function addCookie(name,value,expireHours){ var cookieString=name+& ...

  4. 蓝桥杯 全球变暖(dfs)

    标题:全球变暖 [题目描述]你有一张某海域NxN像素的照片,"."表示海洋."#"表示陆地,如下所示: 其中"上下左右"四个方向上连在一起的 ...

  5. Servlet(六):Cookie

    Cookie 学习:问题: HTTP 协议是没有记忆功能的,一次请求结束后,相关数据会被销毁.如果第二次的请求需要使用相同的请求数据怎么办呢?难道是让用户再次请求书写吗?解决: 使用 Cookie 技 ...

  6. Eclipse中代码字体背景变红/变黄/变绿

    如图所示:运行之后,突然这样.到底是什么原因导致的呢? : 经过查找资料可知:因为Eclipse中有覆盖代码功能 (绿色表示代码被执行到,红色表示代码没有被执行到,黄色表示代码部分执行到) 怎么解决这 ...

  7. 【Linux】-- Linux上java运行环境的配置(JDK+TOMCAT)

    1.JDK安装 安装之前首先要查询软件是否存可以直接使用yum安装 yum search java | grep open 选择需要的版本安装 注意:*星号代表下载该版本的所有文件,不能少. 验证是否 ...

  8. 使用CSS选择器实现选择指定子节点

    HTML CSS 具体效果 其他事例 事例图片来自MDN:https://developer.mozilla.org/zh-CN/docs/Web/CSS/:nth-child

  9. XVIII Open Cup named after E.V. Pankratiev. Grand Prix of SPb

    A. Base $i - 1$ Notation 两个性质: $2=1100$ $122=0$ 利用这两条性质实现高精度加法即可. 时间复杂度$O(n)$. #include<stdio.h&g ...

  10. XVIII Open Cup named after E.V. Pankratiev. Grand Prix of Korea

    A. Donut 扫描线+线段树. #include<cstdio> #include<algorithm> using namespace std; typedef long ...