zoukankan      html  css  js  c++  java
  • 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的时候才移动到我们希望的位置上。

  • 相关阅读:
    表操作
    mysql表的完整性约束
    mysql支持的数据类型
    数据库存储引擎
    Navicat工具、pymysql模块、数据备份
    数据库一
    IO模型
    协成
    线程
    进程
  • 原文地址:https://www.cnblogs.com/zsw-1993/p/4879626.html
Copyright © 2011-2022 走看看