以编程方式添加带有按钮的视图

时间:2012-02-24 07:39:04

标签: ios uibutton

我想以编程方式添加视图和按钮,如下所示。

问题是按钮在点击时没有反应。我的意思是它既不会突出显示也不会调用选择器。

原因是我想为录音(声音文件)实现列表行。列表行应该可以选择向下钻取并有一个播放按钮。所以我得到了一个RecordingView子类UIView,它本身使用构造函数中的目标添加按钮。请参阅下面的代码。

listrow

如果有人有更好的方法来做到这一点,这也可能是一个解决方案。

@implementation MyViewController

- (IBAction) myAction { 
    RecordingView *recordingView = [[RecordingView alloc] initWithFrame:CGRectMake(30, 400, 130, 50)withTarget:self];
    [recordingView setUserInteractionEnabled:YES];
    [[self view] addSubview:recordingView];
}

@implementation RecordingView

- (id)initWithFrame:(CGRect)frame withTarget:(id) target
{
    self = [super initWithFrame:frame];

    UIButton *playButton = [[UIButton alloc] initWithFrame:CGRectMake(185, 5, 80, 40)];
    [playButton setTitle:@"Play" forState:UIControlStateNormal];
    [playButton setTitleColor:[UIColor darkTextColor]forState:UIControlStateNormal];
    // creating images here ...
    [playButton setBackgroundImage:imGray forState: UIControlStateNormal];
    [playButton setBackgroundImage:imRed forState: UIControlStateHighlighted];
    [playButton setEnabled:YES];
    [playButton setUserInteractionEnabled:YES];
    [playButton addTarget: target 
                   action: @selector(buttonClicked:) 
         forControlEvents: UIControlEventTouchDown];

    [self addSubview:playButton];

    return self;
}

当我以相同的方式添加按钮时,直接在视图控制器.m文件中,按钮会在单击时做出反应。所以RecordingView有一些东西。我需要做些什么呢?

此外,有没有更好的方法为触摸事件提供目标和选择器?

1 个答案:

答案 0 :(得分:5)

您可能只需要在userInteractionEnabled上将YES设置为RecordingView

另一个问题是您正在创建帧宽为130的RecordingView,但是您将playButton的X轴原点设置为185.这意味着playButton完全是clipsToBounds超出其超视范围的界限。 NO的默认值为RecordingView,因此无论如何都会绘制按钮。但触摸事件永远不会到达按钮,因为当系统点击测试hitTest:withEvent:时它们会被拒绝。

这来自UIView Class Reference中的clipsToBounds文档:

  

位于接收者界限之外的点永远不会被报告为命中,即使它们实际上位于接收者的一个子视图中。如果当前视图的NO属性设置为RecordingView且受影响的子视图超出视图边界,则会发生这种情况。

您需要使playButton的帧更宽,或将{{1}}移动到其超级视图的范围内。