【问题标题】:Weird issue with UIBarButtonItem custom background imageUIBarButtonItem 自定义背景图像的奇怪问题
【发布时间】:2012-09-14 13:09:54
【问题描述】:

我正在尝试自定义 iOS 5 中的后退按钮。这是我要使用的背景图片:

它是 23 x 30 点。

我要自定义的代码是:

UIImage *buttonBackground = [[UIImage imageNamed:@"navbar-backbutton.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 11, 0, 11) resizingMode:UIImageResizingModeStretch]; 
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Geri" style:UIBarButtonItemStylePlain target:nil action:nil];
[backButton setBackButtonBackgroundImage:buttonBackground forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[self.navigationItem setBackBarButtonItem:backButton];

这应该可以解决问题,图像的宽度为 23 点,我将左右偏移设置为 11 点。但这就是结果(“Geri”在土耳其语中意为“返回”):

我不明白的是最后的大小差异。我不确定我做错了什么。关于这个有什么想法吗?

谢谢。

【问题讨论】:

    标签: ios ios5 ios6 uikit


    【解决方案1】:

    你的代码有什么问题?

    您的 UIEdgeInsets 与您使用的图像不正确,您告诉 UI 过早地开始拉伸图像。您应该更改 UIEdgeInsets 的左侧值以开始向右拉伸几个点。

    什么是边缘插入?

    我注意到您评论了另一个您不了解边缘插图如何工作的答案。所以我为你画了这个。

    黑线代表图像的边框。橙色线代表您希望图像可拉伸的区域。请注意,当按钮的圆形部分结束时,会出现左帽。右帽出现在右边缘的圆角之前。

    您可以使用 UIEdgeInsets 将其表示给 UIKit。

    UIEdgeInsets定义如下(see documentation):

    typedef struct {
        CGFloat top, left, bottom, right;
    } UIEdgeInsets;
    

    解决方案

    在您的情况下,我下载了您尝试使用的按钮,我发现左大写应该从 14 像素开始。右帽应为 18 像素(距右边缘 5 像素)。

    因此,您应该使用以下边缘插图来正确调整图像大小:

    UIEdgeInsets correctInsets = UIEdgeInsetsMake(0.0, 14.0, 0.0, 5.0);
    

    兼容性(iOS 5 和 6)

    另外请注意,您使用的从UIImage 调整大小的方法仅适用于 iOS 6:

    -resizableImageWithCapInsets:resizingMode:
    

    您应该改用此方法以使其在 iOS 5 中正常工作:

    -resizableImageWithCapInsets:
    

    UIImage documentation

    【讨论】:

      【解决方案2】:

      试试这个代码

       NSString *ver = [[UIDevice currentDevice] systemVersion];
          IosVersion = [ver floatValue];
      
          UIButton * backButton ;
          backButton = [[UIButton alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 23, 19)];
          if(IosVersion >= 5.0)
      
              [backButton setBackgroundImage:[[UIImage imageNamed:@"navbar-backbutton"] resizableImageWithCapInsets:UIEdgeInsetsMake(0.0f, 15.0f, 0.0f, 15.0f)]forState:UIControlStateNormal];
      
          else
      
              [backButton setBackgroundImage:[[UIImage imageNamed:@"navbar-backbutton"]stretchableImageWithLeftCapWidth:15 topCapHeight:15]forState:UIControlStateNormal];
      
      
          [backButton.titleLabel setText:@"Geri"];
          [backButton setFrame: CGRectMake(0, 0, 23, 19)];
      
          [backButton addTarget:self action:@selector(goToHome) forControlEvents:UIControlEventTouchUpInside];
          UIBarButtonItem *HomeButton = [[UIBarButtonItem alloc] initWithCustomView: backButton];
          [self.navigationItem setLeftBarButtonItem:HomeButton];
      

      【讨论】:

      • 实际上UIEdgeInsetsMake(0, 15, 0, 7) 成功了,但我不明白为什么。所以你建议使用initWithCustomView?
      • @newth 这里的代码是创建一个带有自定义视图的UIBarButtonItem,它没有使用UIAppearance 协议来自定义本机组件。 UIAppearance 仅适用于 iOS 5 及更高版本,因此此解决方案也适用于早期版本的 iOS。老实说,这在今天已经没有那么有用了。你应该使用UIAppearance 协议来做你正在做的事情。看我的回答。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      相关资源
      最近更新 更多