【问题标题】:UIBarButtonItem with custom view not showing after first view具有自定义视图的 UIBarButtonItem 在第一个视图后未显示
【发布时间】:2011-09-01 03:50:13
【问题描述】:

好吧,这很奇怪。我一直在努力调试它一个小时。

我创建了一个带有自定义视图的 UIBarButtonItem,这是一个分配有图像的 UIButton。代码如下

UIButton *btnAdd = [[[UIButton alloc] initWithFrame:CGRectMake(0, 0, 28, 28)] autorelease];

[btnAdd setImage:[UIImage imageNamed:@"btn_add"] forState:UIControlStateNormal];

[btnAdd addTarget:self
           action:@selector(addBox)
 forControlEvents:UIControlEventTouchUpInside];

UIBarButtonItem *add = [[UIBarButtonItem alloc] initWithCustomView:btnAdd];

self.navigationItem.rightBarButtonItem = add;

它位于扩展 UIViewController 上的我的 - (id)initWithNibName: 方法中

在 UIViewController 第一次出现时,按钮正常显示,并且工作正常。但是,如果我推到另一个视图控制器,然后回击,按钮是不可见的。

即使它不可见,该按钮仍然有效。我可以点击它,它的行为正常。我知道它是那里的原始 UIButton,因为我已经对其内存地址和其他属性进行了跟踪......它的隐藏属性是 FALSE,它的 alpha 属性设置为 1.00f

起初我认为这可能是一个深度问题,但我有代码在每个帧循环中将我的自定义 UINavigationBar 背景推到后面,并且没有任何变化。查看更新

这几乎就像是图像正在释放或在幕后,但指针也很好......

我猜这是一些奇怪的绘图怪癖,我只需要四处游荡,但谷歌很难解决这个问题。

任何提示将不胜感激。

更新

事实证明这是一个深度问题。我在drawRect上绘制一个自定义背景:,并且该代码确实将自定义背景推到了视图堆栈的后面,但是,这个方法只被私有框架方法调用一次......因此当栏被重绘后第一个视图,背景没有被强制退回,出于某种愚蠢的原因,它决定重绘它后面的按钮。

所以现在我正试图弄清楚如何在每次呈现 UINavigationBar 时强制将背景推回。

【问题讨论】:

  • 最好在viewDidLoad的导航栏中添加按钮。先试试这个。并尝试将该图像设置为所有 UIButton 状态。
  • 我真的很高兴找到了这个,我正在经历同样的事情。下面的解决方案对我来说不够用,更像是黑客。但如果你已经解决了这个问题,我很想看看你做了什么。

标签: iphone objective-c ios cocoa-touch uikit


【解决方案1】:

像这样尝试它的工作对我来说很好

    UIImage *image = [UIImage imageNamed:@"btn_set-as-fea.png"];
    UIImage *hilghtedImage=[UIImage imageNamed:@"btn_set-as-fea_h.png"];
    CGRect frame = CGRectMake(0, 0, image.size.width, image.size.height);

    UIButton* someButton = [[UIButton alloc] initWithFrame:frame];
    [someButton addTarget:self action:@selector(SetAsFeatured) forControlEvents:UIControlEventTouchUpInside];
    [someButton setBackgroundImage:image forState:UIControlStateNormal];
    [someButton setBackgroundImage:hilghtedImage forState:UIControlStateHighlighted];
    [someButton setShowsTouchWhenHighlighted:YES];
   setAsFeatured = [[UIBarButtonItem alloc] initWithCustomView:someButton];

【讨论】:

    【解决方案2】:

    曾几何时,我经历过同样的痛苦。我实施了以下永久解决方案,并且效果很好......

    btnAdd 是一个 UIButton,您可以通过设置它的 x 和 y 来设置所需的位置。

        - (void)viewDidLoad 
        {
            btnAdd = [UIButton buttonWithType:UIButtonTypeCustom];
            btnAdd.frame = CGRectMake(250, 6, 61, 30);
            [btnAdd setImage:[UIImage imageNamed:@"btnAdd.png"] forState:UIControlStateNormal];
            btnAdd.backgroundColor = [UIColor clearColor];  
            [self.navigationController.navigationBar addSubview:btnAdd];
            [btnAdd addTarget:self action:@selector(btnAdd_clicked:) forControlEvents: UIControlEventTouchUpInside]; 
        }
        - (void)viewWillAppear:(BOOL)animated
        {   
            [btnAdd setHidden:FALSE];
        }
        - (void)viewWillDisappear:(BOOL)animated
        {
            [btnAdd setHidden:TRUE];    
        }
        - (void) btnAdd_clicked
        {
            // Your logic...
        }
    

    【讨论】:

      【解决方案3】:

      你应该试试这个link。当导航控制器上有任何导航时,它允许将自定义图像发送回。

      【讨论】:

        【解决方案4】:

        既然你说 UINavigationBar 在后台,你可以使用

        [UIView bringSubviewToFront:barName];
        

        把它带到前面,或者

        [UIView sendSubviewToBack:background];
        

        将背景发送到视图堆栈的底部。

        【讨论】:

          【解决方案5】:

          调用setNeedsDisplay 有任何效果吗?特别是关于您使用drawRect 创建自定义背景的更新?

          如果您需要将显示更新为任何更改的表示,通常需要 setNeedsDisplay,通常通过更改 drawRect

          【讨论】:

            【解决方案6】:

            在我的例子中,我在整个应用程序中使用自动布局,并编写了一个自定义按钮,我在构造函数中有以下行:

            button.setTranslatesAutoresizingMaskIntoConstraints(false)
            

            当我尝试将此按钮用作 UIBarButtonItem 的自定义视图时,它没有绘制。

            长话短说,确保 translatesAutoResizingMaskIntoConstraints 设置为 true

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-08-11
              • 1970-01-01
              • 1970-01-01
              • 2016-02-29
              • 1970-01-01
              相关资源
              最近更新 更多