• iOS7新特性-完美解决iOS7关于自定义导航条UIBarButtonItem偏移的问题


    前言:

    本文由DevDiv社区@Vincent 原创,转载请注明出处!

    http://www.devdiv.com/iOS_iPhone-ios_ios_uibarbuttonitem_-thread-206858-1-1.html

    问题引入:

    iOS7中导航栏按钮图片会有左右偏移,比如leftBarButtonItem可能会向右偏移10几个像素。


    解决办法1:

    自定义一个Button,代码如下:

    1

    @interface BarItemButton : UIButton

    2

     

    3

    @end



    实现如下方法:

    01

    - (UIEdgeInsets)alignmentRectInsets

    02

    {

    03

        UIEdgeInsets insets;

    04

        if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)

    05

        {

    06

            if([self isLeftButton])

    07

            {

    08

                insets = UIEdgeInsetsMake(0, 13, 0, 0);

    09

            }

    10

            else

    11

            {

    12

                insets = UIEdgeInsetsMake(0, 0, 0, 13);

    13

            }

    14

        }

    15

        else

    16

        {

    17

            insets = UIEdgeInsetsZero;

    18

        }

    19

         

    20

        return insets;

    21

    }

    22

     

    23

    - (BOOL)isLeftButton

    24

    {

    25

        return self.frame.origin.x < (self.superview.frame.size.width / 2);

    26

    }


    然后把这样一个Button作为left button,代码如下:

    1

        UIButton* btn = [BarItemButton buttonWithType:UIButtonTypeCustom];

    2

        btn.frame = CGRectMake(0, 0, 45, 40);

    3

        [btn setImage:[UIImage imageNamed:@"come_back.png"] forState:UIControlStateNormal];

    4

    [btn addTarget:self action:@selector(handleBack:) forControlEvents:UIControlEventTouchUpInside];

    5

        self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:btn];


    这样可以解决问题,但并不完美,

    如果我们我们从一个controller跳转到这样一个controller中:

    [self.navigationController pushViewController:[[TestViewController alloc] init] animated:YES];

    那么你会发现这个left button位置一开始并不正确,然后通过一个动画移动到我们希望的位置上。


    大致效果是这样,controller启动时候有一个明显的动画,蓝色的view在移动,而导航栏上的button也在移动

     

    启动完成后button才回到正确的位置,如下图

     


    而这个动画显然不是我们需要的!


    解决办法2:

    去掉button的alignmentRectInsets方法实现,

    将left button设置代码修改如下:

    1

      self.view.backgroundColor = [UIColor blueColor];

    2

        UIButton* btn = [BarItemButton buttonWithType:UIButtonTypeCustom];

    3

        btn.frame = CGRectMake(0, 0, 45, 40);

    4

        [btn setImage:[UIImage imageNamed:@"come_back.png"] forState:UIControlStateNormal];

    5

        btn.imageEdgeInsets = UIEdgeInsetsMake(0, -13, 0, 0);

    6

        [btn addTarget:self action:@selector(handleBack:) forControlEvents:UIControlEventTouchUpInside];

    7

        self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:btn];



    这里最重要是的我们设置了button的imageEdgeInsets,让它在构造的时候就在-13这个位置固定住,而不是layout的时候才移动到我们希望的位置上。

  • 相关阅读:
    VC编译器遇到问题处理
    C++笔试、面试题总结
    变量自增整理
    当app出现线上奔溃,该如何办?
    Xcode9新变化
    iOS开发~制作同时支持armv7,armv7s,arm64,i386,x86_64的静态库.a
    百度总裁陆奇:人工智能时代,我们想把它变得更简单
    【转】iOS库 .a与.framework区别
    【转】谈谈 iOS 中图片的解压缩
    【转】iOS中流(Stream)的使用
  • 原文地址:https://www.cnblogs.com/zsw-1993/p/4879625.html
Copyright © 2020-2023  润新知