横向 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 高度
UIImagePicker 的 presentModalViewController 在 iPhone 3.0 的横向模式下失败