子类化 UIToolbar 并覆盖 drawRect: - UIBarButtonItems 不显示

Posted

技术标签:

【中文标题】子类化 UIToolbar 并覆盖 drawRect: - UIBarButtonItems 不显示【英文标题】:Subclassing UIToolbar and overriding drawRect: - UIBarButtonItems NOT displaying 【发布时间】:2013-04-25 15:43:02 【问题描述】:

上下文

我正在使用“initWithNavigationBarClass”方法来初始化带有自定义工具栏的 UINavigationController,这是我分配初始化 UINavigationController 的行

navigationController = [[UINavigationController alloc] initWithNavigationBarClass:nil toolbarClass:[QuestionToolbar class]];

是类,“QuestionToolbar”,我继承UIToolbar并覆盖drawrect,这里是drawRect方法:

    - (void)drawRect:(CGRect)rect
    
      [super drawRect:rect];
      UIImage *backgroundImage = [UIImage imageNamed:@"44px_background_red.png"];
      [backgroundImage drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
    

这是我尝试添加 UIBarButtonItems 的 viewController 中的相关代码

UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *beginItem = [[UIBarButtonItem alloc] initWithTitle:@"Begin Quiz" style:UIBarButtonItemStylePlain target:self action:@selector(beginAction:)];

[beginItem setTitleTextAttributes:[NSDictionary dictionaryWithObjectsAndKeys: [UIColor whiteColor], UITextAttributeTextColor,nil] forState:UIControlStateNormal];

NSArray *items = [NSArray arrayWithObjects:spacer, beginItem, spacer, nil];
[self.navigationController.toolbar setItems:items];

[self.navigationController setToolbarHidden:NO];

问题

如何将 UIBarButtonItems 添加到此工具栏,因为当我尝试添加它们时它们不显示?

我认为这与我的重写 drawRect 有关

【问题讨论】:

我想我明白了,我使用的是这段代码:[self.navigationController.toolbar setItems:items] 没有用。但是,如果我使用 self.toolbarItems = items 它就可以了。不知道为什么? 【参考方案1】:

我尝试使用自定义 UIToolbar,但问题不是来自 -(void)drawRect:(CGCrect)rect

我不知道您是否尝试在 UIToolbar 上添加按钮,但您应该尝试将它们添加到 UIViewController 类的 -(void)viewDidAppear 方法中。通过这种方式,它对我有用。

【讨论】:

感谢您的回答 danypata,请参阅我之前的评论,我改为使用 self.toolbarItems 而不是 self.navigationController.toolbar setItems:item 并修复了它。知道为什么吗? 所以基本上Apple Docs声明导航控制器obtains its current set of items from the toolbarItems property of the active view controller。所以基本上设置 toolbarItems 的正确方法是通过 UIViewController.toolbarItems 属性。 @我不相信这是正确的,请参阅:***.com/questions/16228275/…

以上是关于子类化 UIToolbar 并覆盖 drawRect: - UIBarButtonItems 不显示的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的自定义 UI 元素:子类化 CALayer 并覆盖 drawInContext 导致像素化绘图

子类化并覆盖 PySide2 小部件方法;我在哪里可以找到参考资料?

子类化 UIApplication 以覆盖 sendEvent 导致崩溃

如果 drawRect: 被覆盖,子类化的 UIView 显示黑色背景

在 UIToolbar 中的 UIBarButtonItem 上更改 tintColor 会导致按钮消失并从左侧动画化

UIToolbar 具有半透明而不是黑色