UINavigationController切换视图的简单使用

UINavigationController通过栈的方式来管理视图,通过push将视图压入栈,pop将视图推出栈。

下面通过简单的示例说明

AppDelegate.m

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

    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

    ViewController *vc = [[ViewController alloc] init];

    UINavigationController *vcNav = [[UINavigationController alloc] initWithRootViewController:vc];
    self.window.rootViewController = vcNav;

    [self.window makeKeyAndVisible];

    return YES;
}

ViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor whiteColor];
    /*

     导航标题的设置可通过三种方式,且显示优先级如下:
     self.navigationItem.titleView > self.navigationItem.title > self.title

     例如这里我们同时使用前两种方式,则默认显示titleView的内容

     */
    //导航标题
    UILabel *labelView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 500, 30)];
    labelView.text = @"我是根视图";
    labelView.textAlignment = NSTextAlignmentCenter;
    self.navigationItem.titleView = labelView;
    self.navigationItem.title = @"我不是根视图";

    //左边导航按钮
    UIButton *leftButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 30)];
    [leftButton setTitle:@"按钮" forState:UIControlStateNormal];
    [leftButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithCustomView:leftButton];
    self.navigationItem.leftBarButtonItem = leftItem;
    //右边导航按钮
    UIButton *rightButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 30)];
    [rightButton setTitle:@"跳转" forState:UIControlStateNormal];
    [rightButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [rightButton addTarget:self action:@selector(clickedRightButton) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *rightItem = [[UIBarButtonItem alloc] initWithCustomView:rightButton];
    self.navigationItem.rightBarButtonItem = rightItem;

    /*

     backBarButtonItem的使用
     如果AController push到 BController,那么有以下几种情况
     1:B设置了leftBarButtonItem,则优先显示B的leftBarButtonItem
     2:B没有设置leftBarButtonItem,A设置了backBarButtonItem,则显示A设置的backBarButtonItem
     3:B没有设置leftBarButtonItem,A没有设置backBarButtonItem,则系统会拿到A的title显示一个返回按钮
     所以B左边按钮的显示优先级如下:
     B的leftBarButtonItem > A的backBarButtonItem > 系统默认的返回按钮
     大家可以先注释掉标号①的那行代码,然后同时注释掉标号①②的代码,来试验一下。

     这里注意,backBarButtonItem只能自定义title和image,如下注释掉的方法是无效的。

     */
    //返回按钮
    //    UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 30)];
    //    [backButton setTitle:@"返回" forState:UIControlStateNormal];
    //    [backButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    //    UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];
    UIBarButtonItem *backItem = [[UIBarButtonItem alloc] initWithTitle:@"我是返回" style:UIBarButtonItemStylePlain target:self action:nil];
    self.navigationItem.backBarButtonItem = backItem;                               //②

    UILabel *tipsLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 300, self.view.frame.size.width-40, 20)];
    tipsLabel.text = @"我是根视图";
    tipsLabel.textAlignment = NSTextAlignmentCenter;
    tipsLabel.textColor = [UIColor redColor];
    [self.view addSubview:tipsLabel];

}
- (void)clickedRightButton
{
    ChildViewController *childVC = [[ChildViewController alloc] init];
    [self.navigationController pushViewController:childVC animated:YES];
}

ChildViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor lightGrayColor];
    //导航标题
    UILabel *labelView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 10, 30)];
    labelView.text = @"我是子视图";
    labelView.textAlignment = NSTextAlignmentCenter;
    self.navigationItem.titleView = labelView;
    //左边导航按钮
    UIButton *leftButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 30)];
    [leftButton setTitle:@"返回" forState:UIControlStateNormal];
    [leftButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    [leftButton addTarget:self action:@selector(clickedLeftButton) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithCustomView:leftButton];
    self.navigationItem.leftBarButtonItem = leftItem;                       //①
    //右边导航按钮
    UIButton *rightButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 30)];
    [rightButton setTitle:@"按钮" forState:UIControlStateNormal];
    [rightButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    UIBarButtonItem *rightItem = [[UIBarButtonItem alloc] initWithCustomView:rightButton];
    self.navigationItem.rightBarButtonItem = rightItem;

    UILabel *tipsLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 300, self.view.frame.size.width-40, 20)];
    tipsLabel.text = @"我是子视图";
    tipsLabel.textAlignment = NSTextAlignmentCenter;
    tipsLabel.textColor = [UIColor blueColor];
    [self.view addSubview:tipsLabel];
}

- (void)clickedLeftButton
{
    [self.navigationController popViewControllerAnimated:YES];
}

再说明下titleView的宽度问题

根视图中将labelView设置了500的宽度,而子视图中将labelView设置了10的宽度,但是显示效果是一样的,下面我们详细对比下这两种有什么不同。

我们可以看到,leftBarButtonItem距离左边距有16个像素,和titleView至少有6像素的距离;rightBarButtonItem同理。

所以我们假设屏幕宽度为ScreenW,标题文字的实际宽度为labelW,左边按钮宽度为leftW,右边按钮宽度为rightW,titleView的最终宽度为titleViewW。

①如果titleViewW < labelW,则titleViewW 为 labelW;

②如果labelW < titleViewW < ScreenW-16*2-6*2-leftW-rightW,则titleViewW 为 titleViewW;

③如果titleViewW > ScreenW-16*2-6*2-leftW-rightW,则titleViewW 为 ScreenW-16*2-6*2-leftW-rightW。

实际开发中可能会遇到标题过长,需要使用省略号“…”显示,如下图所示

此时让标题居中的办法就是将leftW和rightW设置为相等即可;

如果只有左边返回按钮,而没有右边按钮,则放置一个空视图占位,即可方便实现标题居中。

时间: 2025-01-19 18:57:50

UINavigationController切换视图的简单使用的相关文章

iOS设计之 多视图导航栏UINavigationController切换视图的简单设计

在iOS平台上创建有个工程,之后在工程中创建两个类视图 操作步骤如下 1.在分别在两个类视图中对主视图设置背景色 FirstViewController.m #import "FirstViewController.h" @interface FirstViewController () @end @implementation FirstViewController - (void)viewDidLoad {    [super viewDidLoad];        //设置主视

UINavigationController切换视图 实例

现版本 SDK 8.4 Xcode 运行Xcode 选择 Create a new Xcode project ->Single View Application 命名 NavigationControllerDemo 一.创建 Empty Application 把工程目录下的Main.storyboard和LaunchScreen.xib删除,扔进废纸篓.(ViewController.h ViewController.m也可删除) 打开Info.plist,把Launch screen i

简单的选择切换视图

简单的选择切换视图,自定义选择类目和默认类目. SelectiveView.h #import <UIKit/UIKit.h> @protocol SelectiveViewDelegate <NSObject> //此代理方法中可做数据切换等操作 - (void)selectiveTag:(NSInteger)selectiveTag; @end @interface SelectiveView : UIView { //按钮个数 NSInteger buttonCount; /

ViewPager可滑动页面+点击标题栏切换视图

功能: 滑动切换视图.标题栏. 标题栏字体颜色随当前视图改变而改变. 点击标题栏可切换视图. 1.主页面布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:

iOS开发:使用Tab Bar切换视图

iOS开发:使用Tab Bar切换视图 上一篇文章提到了多视图程序中各个视图之间的切换,用的Tool Bar,说白了还是根据触发事件使用代码改变Root View Controller中的Content View.这次,我们还是讲一讲切换视图,不过这次使用的是Tab Bar. 这次要写的程序运行起来的效果是这样的:底部有几个图标,每个图标对应一个视图.每点击一个图标,对应的视图就会打开.如下图,就是我们做好的程序效果:    每个Tab Bar有一个对应颜色的视图. 为了搞清使用Tab Bar切

【转】Unity3D 场景切换与持久化简单数据储存(PlayerPrefs类)

本篇文章主要介绍了"Unity3D 场景切换与持久化简单数据储存(PlayerPrefs类)",主要涉及到Unity3D 场景切换与持久化简单数据储存(PlayerPrefs类)方面的内容,对于Unity3D 场景切换与持久化简单数据储存(PlayerPrefs类)感兴趣的同学可以参考一下. 持久化简单的数据储存在Unity3D 中提供了一个简单有效的方法,如果之前的你做过Android的开发你会发现在Unity3D中持久化数据的储存和Android非常的想象.那么下面MOMO 将用一

UI第四讲.事件处理(按钮点击切换视图,触摸事件)

一.按钮点击切换视图(例题) 二.事件的基本概念 三.触摸的基本概念 四.响应者链

NSViewAnimation视图的简单动画

NSViewAnimation和NSAnimation提供了视图的简单动画效果.NSViewAnimation是从NSAnimation继承下来的.这个类提供了一个简便的方式去给多个视图或窗口做动画效果.动画的效果可以改变视图的位置,大小,淡入淡出. - (id)initWithViewAnimations:(NSArray*)viewAnimations 初始化方法需要参数是一个包含字典对象的数组对象.这个字典对象信息包含4个键值对.如下 NSString *NSViewAnimationTa

数据库视图及其简单创建

视图是一个虚拟的表,该表中的数据是由一个查询语句执行后所得到的查询结果所构成的. 创建视图: CREATE VIEW VIEW_Name AS SQL 语句 例子: create view pr_例四asselect 产品.产品ID,产品.产品名称,产品.供应商,类别.类别名称,类别.说明from 产品 inner join类别 on 产品.类别ID=类别.类别ID 查看视图: select * from pr_例四 结果 数据库视图及其简单创建