iOS:分割控制器UISplitViewcontroller

iOS:分割控制器UISplitViewcontroller

分割控制器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上的基本样式截图为:

iOS:分割控制器UISplitViewcontroller

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

iOS:分割控制器UISplitViewcontroller

 

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

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

iOS:分割控制器UISplitViewcontroller

 

iOS:分割控制器UISplitViewcontroller

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

iOS:分割控制器UISplitViewcontroller

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

演示结果如下:

开始时:

iOS:分割控制器UISplitViewcontroller

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

iOS:分割控制器UISplitViewcontroller

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

iOS:分割控制器UISplitViewcontroller

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

iOS:分割控制器UISplitViewcontroller

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/109286.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 【实战】工作中常用的PHP 操作 Redis 的基本方法「建议收藏」

    【实战】工作中常用的PHP 操作 Redis 的基本方法

  • phpstrom2021激活码_在线激活

    (phpstrom2021激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html…

  • Mysql锁详解(行锁、表锁、意向锁、Gap锁、插入意向锁)

    Mysql锁详解(行锁、表锁、意向锁、Gap锁、插入意向锁)锁:对“某种范围”的数据上“某种锁”1.“某种范围”:行、表2.“某种锁”2.1共享锁SharedLocks(S锁)1、兼容性:加了S锁的记录,允许其他事务再加S锁,不允许其他事务再加X锁2、加锁方式:select…lockinsharemode2.2排他锁ExclusiveLocks(X锁)1、兼容性:加了X锁的记录,不允许其他事务再加S锁或者X锁2、加锁方式…

  • shell编程入门_unix编程

    shell编程入门_unix编程1.Shell的概念shell是一个命令行解释器,它为客户提供了一个Linux内核发送请求一边运行程序界面系统级程序,用汉语可以通过shell启动、挂起、停止甚至编写一些程序。shell还是一个功能强大的编程语言,易于编辑,易于调试,灵活性强,shell是结识知识性的脚本语言,在我们shell中直接调用Linux的系统命令操作即可。2.Shell的分类(1)BourneShell(bshell)从1979年在unix系统就开始使用了。它的主要…

    2022年10月31日
  • HTML实用的网页代码大全[通俗易懂]

    HTML实用的网页代码大全[通俗易懂]【一】:符号&lt;p&gt;段落&lt;/p&gt; &lt;h&gt;标题&lt;/h&gt;(h1—h6) &lt;br&gt;:换行 &lt;hr&gt;:分割线 左右尖括号:&amp;lt;&amp;gt; &amp;表示为:&amp;amp "表示为:&amp;quot; 表格形式&lt;table&gt;

  • 用域代码任何带圈字符都能做出来

    用域代码任何带圈字符都能做出来在文档中按下“Ctrl+F9”组合键输入域记号(一对大括号{},不能用键盘直接输入),在域记号中输入如下域代码:eq/o/ac(○,11B)。设置好字体、字号等。  选中上述域代码,按“Alt+F9”组合键看一下效果。如果不满意,再按一次“Alt+F9”组合键切换回域代码状态,分别选中域代码中的“○”或“11B”,执行“格式→字体”命令,打开“字体”对话框,在“字体”和“字符间距”标签中,通

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号