横向 iPhone 中的 UIBarButtonItem 高度

Posted

技术标签:

【中文标题】横向 iPhone 中的 UIBarButtonItem 高度【英文标题】:UIBarButtonItem height in landscape iPhone 【发布时间】:2010-11-09 21:34:39 【问题描述】:

我在 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 中有一个自定义按钮时。当应用旋转时,我也需要它缩小。

提前感谢您能给我的任何指点!

【问题讨论】:

hint 适用于 iOS5 用户。现在有一个 [[UIBarButtonItem alloc] initWithImage: LandscapeImagePhone:... 方法。 我的项目位于导航栏中,因此它们的样式始终为 UIBarButtonItemStyleBordered,除非我使用自定义视图创建它们。在这种情况下,我的自定义视图是否也可以作为系统项调整为 18x18 像素? 【参考方案1】:

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

【讨论】:

感谢您的帮助。我的图像现在是 20x20,但它仍然不像系统按钮图像那样缩放。所以我真的有同样的问题。对于较细的导航栏上的较小按钮,它看起来太大了。 当检测到方向发生变化时,您是否尝试过手动调整图像大小/重新缩放或将图像更改为特定横向版本? 您必须按照建议手动执行此操作。太糟糕了。【参考方案2】:

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

- initWithImage:landscapeImagePhone:style:target:action:

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

经过一些测试,我注意到 iPhone 确实缩小了导航栏,因此导航栏上的 UIBarButtonItems 会缩小,但 iPhone 6 Plus 没有。 6 Plus 似乎将导航栏的高度保持在 44 像素,而普通 iPhone 将其缩小到 32 像素。因此,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 的依赖不如对导航栏高度的依赖。我不确定。请注意,这种不一致将来可能会“修复”,因此会导致不同的行为。

【讨论】:

【参考方案3】:

我有类似的问题。现在我使用自定义类型来按钮。例如这是我的 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;

然后你可以在旋转时调整bar Button自定义视图框架。

提示:

    在旋转方法中,例如 willAnimateRotationToInterfaceOrientation,打印自定义视图 导航栏按钮项目的框架..,并获得正确的 你想要的框架(在纵向模式下),你也可以看到框架是 在横向模式下不正确,我们需要修复它。 通过引用正确的框架值来修复横向栏按钮框架问题。

就我而言,我只是简单地修复了自定义视图的来源...例如

// 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 是 frame 的 y。

【讨论】:

以上是关于横向 iPhone 中的 UIBarButtonItem 高度的主要内容,如果未能解决你的问题,请参考以下文章

横向 iPhone 中的 UIBarButtonItem 高度

iPhone X 横向状态栏

修改 iPhone 以仅强制横向方向 [重复]

iPhone 横向模式返回不正确的视图大小

UIImagePicker 的 presentModalViewController 在 iPhone 3.0 的横向模式下失败

iPhone X横向全屏UICollectionViewCell问题