对于我的 iOS 7 应用程序,我有一个 UIToolbar 包含一组 UIBarButtonItems,并且对于一个特定的项目,我希望有一个自定义的外观。
我只想将项目放在情节提要上,并指定其类,而不通过代码对 UIToolbar 进行操作。一种选择是使用外观,但不幸的是它会导致更改所有 UIBarBUttonItem。
一些旧的 SO 帖子建议继承 UIBarButtonItem 并使用 drawRect,这将是理想的解决方案,但不幸的是,这种方法似乎根本没有被调用。
对于我的 iOS 7 应用程序,我有一个 UIToolbar 包含一组 UIBarButtonItems,并且对于一个特定的项目,我希望有一个自定义的外观。
我只想将项目放在情节提要上,并指定其类,而不通过代码对 UIToolbar 进行操作。一种选择是使用外观,但不幸的是它会导致更改所有 UIBarBUttonItem。
一些旧的 SO 帖子建议继承 UIBarButtonItem 并使用 drawRect,这将是理想的解决方案,但不幸的是,这种方法似乎根本没有被调用。
我知道您的问题现在很可能已经解决了,但是使用 Xcode 6,您现在可以随心所欲地做事了!
Xcode 6 允许使用宏IB_DESIGNABLE
并IBInspectable
自定义您可以在 Interface Builder 的检查器中更改的内容!
只需IBInspectable
在属性的类型声明之前定义(在 .h 中)以将该属性公开给 IB,然后设置它。
如果您IB_DESIGNABLE
在 之前定义@interface
,您还可以在 IB 中看到对该自定义属性的更改!
下面的例子应该提供你想要做的,住在 Xcode 6 的 IB 中:
#import <UIKit/UIKit.h>
IB_DESIGNABLE @interface MyBarButtonItem : UIBarButtonItem
@property (nonatomic, retain) IBInspectable UIImage *backgroundImage;
@end
#import "MyBarButtonItem.h"
@implementation MyBarButtonItem
-(void)setBackgroundImage:(UIImage *)backgroundImage {
[self setBackgroundImage:backgroundImage
forState:UIControlStateNormal
barMetrics:UIBarMetricsDefault];
}
-(UIImage *)backgroundImage {
return [self backgroundImageForState:UIControlStateNormal
barMetrics:UIBarMetricsDefault];
}
@end
对上述代码的轻微免责声明:出于显而易见的原因,这仅为条形指标和硬编码的控制状态定义了背景图像。
有关更直观的示例,请参阅 Apple 的以下文档:
您想要的是使用 [UIImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] 设置图像,这样就不会发生外观代理着色,并且您可以控制按钮图像。
不幸的是,我看不到这可以通过 XIB 完成……但如果您可以通过代码访问按钮,请执行以下操作:
[myBarButton setImage:[[UIImage imageNamed:@"yourButtonImage"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] forState:UIControlStateNormal];
其中 myBarButton 是您的 UIBarButtonItem,而 yourButtonImage.png 是您的条形按钮图像。此图像将显示为未着色。