横向iPhone中的UIBarButtonItem高度

时间:2010-11-09 21:34:40

标签: iphone uinavigationbar uibarbuttonitem uinavigationitem titleview

我在iPhone应用中有一个导航栏,其中包含自定义UIBarButtonItems:

UIBarButtonItem* homePersonButton = [[UIBarButtonItem alloc]
       initWithImage:[UIImage imageNamed:@"homePerson.png"]
               style:UIBarButtonItemStylePlain
              target:self action:@selector(showHomePerson)];

homePerson.png是20 x 18。

在纵向模式下效果很好,但在横向模式下,按钮上的20x18图像太高,看起来不太好。看起来iOS在标准按钮上做了一些工作,以便在更薄的导航栏中根据需要缩小图像。

处理此问题的最佳方法是什么?

另一个例子是我在导航栏的titleView中有一个自定义按钮。当应用程序旋转时,我也需要缩小它。

提前感谢你能给我的任何指示!

3 个答案:

答案 0 :(得分:5)

工具栏和导航栏图像的大小为20 x 20,因此当您提供的图像不符合这些尺寸时,您需要离开框架来调整图像大小/缩放图像,从而导致出现问题。将图像调整大小/缩放到20x20,图像在纵向和横向上都应该看起来正确。

答案 1 :(得分:3)

steipete在评论中提到了这一点,但我觉得现在需要回答这个问题。从iOS 5开始,您可以使用UIBarButtonItem initializer

- initWithImage:landscapeImagePhone:style:target:action:

只需将landscapeImagePhone图片设置为您希望在横向上调整大小的图像的较小版本。

经过一些测试后,我注意到iPhone确实缩小了导航栏,因此导航栏上的UIBarButtonItem缩小了,但iPhone 6 Plus 。 6 Plus似乎将导航栏保持在44px的高度,而普通的iPhone将其缩小到32px。因此,6 Plus也在景观中使用landscapeImagePhone

我测试了这个不只是使用landscapeImagePhone的较小尺寸图像,而是完全不同的图像。 6 Plus上的图像从未改变过。


但是,请注意iPhone 6 Plus上iOS 9.2的以下内容:

Apple documentation for this initializer表示landscapeImagePhone是:

  

用于UIUserInterfaceIdiomPhone习语中横条中项目的图像。

从iOS 9.2开始,6 Plus在纵向和横向都报告为UIUserInterfaceIdiomPhone。之前,6 Plus曾经是UIUserInterfaceIdiomUnspecified。我不确定何时更新了。但是,由于它现在是UIUserInterfaceIdiomPhone,根据文档,landscapeImagePhone也应该适用于6 Plus。

所以也许它并不像UIUserInterfaceIdiom那样依赖导航栏的高度。我不确定。请注意,这种不一致可能会被修复"在未来,因此会导致不同的行为。

答案 2 :(得分:0)

我有类似的问题。现在我使用自定义类型按钮。例如这是我的UIBarButtonItem目录。 您可以使用它来构建自定义栏按钮。

+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image highlightedImage:(UIImage *)highlightedImage     target:(id)target action:(SEL)action{
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setBackgroundImage: [image stretchableImageWithLeftCapWidth:7.0 topCapHeight:0.0] forState:UIControlStateNormal];
    button.frame= CGRectMake(0.0, 0.0, image.size.width, image.size.height);
    [button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *barItem = [[UIBarButtonItem alloc] initWithCustomView:button];

    return barItem;
}

然后您可以在旋转时调整条形按钮自定义视图框。

提示:

  1. 在旋转方法中,例如, willAnimateRotationToInterfaceOrientation,打印自定义视图 导航栏按钮项的框架..,并得到正确的 框架(在protrait模式下)你想要的,你也可以看到框架是 在横向模式下不正确,我们需要修复它。
  2. 通过参考正确的帧值来修复横向栏按钮框架问题。
  3. 就我而言,我只是简单地修复了自定义视图的来源......例如。

    // adjust the navigation Item top, otherwise it is not proper set after rotation
    _centralRootViewController.navigationItem.leftBarButtonItem.customView.top = 5;
    _centralRootViewController.navigationItem.rightBarButtonItem.customView.top = 5;
    

    注意:top是框架的y。