zoukankan      html  css  js  c++  java
  • 关于UINavigationController的backBarButtonItem定制问题

      之前有很多项目中需要对backBarButtonItem定制,使用了很多种方法,也走了很多弯路。

      第一种:

        刚开始对整体不是很熟悉,直接在当前ctl里面使用下列代码进行定制:

    1     UIButton * testButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
    2     [testButton setBackgroundImage:[UIImage imageNamed:@"test"] forState:UIControlStateNormal];
    3     [testButton setBackgroundImage:[UIImage imageNamed:@"test1"] forState:UIControlStateHighlighted];
    4     
    5     UIBarButtonItem * backBarButton = [[UIBarButtonItem alloc] initWithCustomView:testButton];
    6     self.navigationItem.backBarButtonItem = backBarButton;

      但是毫无效果,后来了解到是两个问题导致:1、当前backBarButtonItem应该在UINavigationController的栈中当前ctl的上一级ctl中生成。

                          2、backBarButtonItem 如果使用- (id)initWithCustomView:(UIView *)customView;生成是不会有效果的。

      由于只能使用其他的方法初始化,不能很好的定制,所以有局限性。

      后来网上搜索,发现最常见的解决方案是对当前的ctl的leftBarButtonItem进行定制。

      第二种:

        UIButton * testButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
        [testButton setBackgroundImage:[UIImage imageNamed:@"test"] forState:UIControlStateNormal];
        [testButton setBackgroundImage:[UIImage imageNamed:@"test1"] forState:UIControlStateHighlighted];
        
        UIBarButtonItem * backBarButton = [[UIBarButtonItem alloc] initWithCustomView:testButton];
        self.navigationItem.leftBarButtonItem = backBarButton;

      这种方法可以对当前ctl的backBarButtonItem进行比较好的定制。后来有需求要把backBarButtonItem做成系统一样的风格,但是又要改变那个返回的小箭头图标,说是箭头太粗。 由于backBarButtonItem的标题会变化,本想定制一个UIButton,根据返回图标和标题布局,但是做起来又觉得麻烦,后来想到了很好用的方法3

      

      第三种:

      

        //注意图片边缘要做成透明的,方便拉升

        UIImage *backButtonBackgroundImage = [UIImage imageNamed:@"nav_back_button_normal"];

        // The background should be pinned to the left and not stretch.

        backButtonBackgroundImage = [backButtonBackgroundImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, backButtonBackgroundImage.size.width - 1, 0, 0)];

        

        //定义你想在哪些类中使用这个效果

        id appearance = [UIBarButtonItemappearanceWhenContainedIn:[UINavigationControllerclass], nil];

        [appearance setBackButtonBackgroundImage:backButtonBackgroundImage forState:UIControlStateNormalbarMetrics:UIBarMetricsDefault];

        

        // Provide an empty backBarButton to hide the 'Back' text present by

        // default in the back button.

        //

        // NOTE: You do not need to provide a target or action.  These are set

        //       by the navigation bar.

        // NOTE: Setting the title of this bar button item to ' ' (space) works

        //       around a bug in iOS 7.0.x where the background image would be

        //       horizontally compressed if the back button title is empty.

        UIBarButtonItem *backBarButton = [[UIBarButtonItemalloc] initWithTitle:@"测试"style:UIBarButtonItemStylePlaintarget:nilaction:NULL];

        self.navigationItem.backBarButtonItem = backBarButton;

     

    这个是从Apple官方的Demo里面找到的,直接用图标替换掉就OK。不要做其他麻烦事情。

        

  • 相关阅读:
    java Object类源代码详解 及native (转自 http://blog.csdn.net/sjw890821sjw/article/details/8058843)
    使用库项目开发
    Android 开发规范
    使用Git之后出现android library引用失败
    Github安卓开源项目编译运行
    android项目引入三方类库配置文件
    Web交互设计优化的简易check list
    php程序效率优化的一些策略小结
    SQL语句优化原则
    纯PHP实现定时器任务(Timer)
  • 原文地址:https://www.cnblogs.com/xinxing260/p/3760223.html
Copyright © 2011-2022 走看看