我的Checkbox绘图有什么问题?

时间:2009-05-19 03:30:43

标签: iphone

我构建了一个UIButton子类,这是一个非常基本的复选框。一切正常(例如,我得到了我期望的事件,当我期待时调用drawRect方法等),但我的图像不是绘图。我检查过我的图像不是零,而且我的图像不同。

代码:

-(void)awakeFromNib {
    [super awakeFromNib];
    [self addTarget:self action:@selector(buttonClick) forControlEvents:UIControlEventTouchUpInside];
    self.state=YES;
}

-(void) buttonClick {
    self.state = !self.state;
    [self setNeedsDisplay];
}

-(void)drawRect:(CGRect)rect {
    UIImage *img = nil;
    if (self.state) {
        img = [self backgroundImageForState:UIControlStateSelected];
    }
    else {
        img = [self backgroundImageForState:UIControlStateNormal];
    }
    [img drawInRect:rect];
}

在绘制之前检查'img'的值:

Printing description of img:
<UIImage: 0x52a710>
(gdb) continue

Printing description of img:
<UIImage: 0x52a5d0>

正在NIB中设置背景图像。如果我在IB中更改了所选状态,我会看到正确的图像显示。我也从调用中获得了一个有效的图像(如果我尝试获取未在NIB中设置的imageForState,我就不会这样做。)

子类的原因是我需要一个复选框。 UIButton没有这样做,UISwitch对于除了最实用的观点之外的所有人来说都是丑陋的。

思想?

感谢。

TJ

编辑:添加了子类的所有代码

2 个答案:

答案 0 :(得分:2)

你在哪里设置backgroundImageForState?你确定它是正确的图像吗?作为默认设置,iPhone OS可能会为您提供透明(空白)图像。

其次,我不会使用传入的“rect”参数来绘制图像。这只是告诉你它想要你重绘的区域,不一定是其他任何东西。而是使用

CGRectMake(0, 0, img.size.width, img.size.height)

或类似的东西。

最后,你为什么要做自定义绘图?我做了一些非常相似的事情,你绝对不需要继承和实现drawRect。 UIButton为图像内置了一组非常丰富的选项,包括“突出显示”和“选定”图像,这些图像将通过用户交互自动绘制。让我们知道您需要完成的任务。

答案 1 :(得分:0)

仅仅因为UIImage不是nil并不意味着它包含图像数据。

检查文件名的大小写。
我已经好几次了:

@“CheckBox.png”和@“checkbox.png”是iPhone的2个不同名称。

看起来你可能也在进行一些过早的优化。

我不会深入了解drawRect:我的第一个选择。

使用UIButton子类(您只需要子类来跟踪状态)。在IB中设置按钮并将其放置在您想要的位置。将按钮连接到下面的方法,只需在点击上交换图像:

- (IBAction)toggle:(id)sender{

    MyButtonSubClass *aButton = (MyButtonSubClass*)sender;

    [aButton toggleChecked];

    if(aButton.checked)
        [aButton setImage:checkedImage forState:UIControlStateNormal];
    else
        [aButton setImage:uncheckedImage forState:UIControlStateNormal];


}

可选地,您不能将UIButton子类化并跟踪控制器中的状态