Программно добавляем вид с помощью кнопки - PullRequest
3 голосов
/ 24 февраля 2012

Я хочу добавить вид и кнопку программно, как показано ниже.

Проблема в том, что кнопка не реагирует на нажатия. Я имею в виду, что она не подсвечивается и не вызывает селектор.

Причина в том, что я хочу реализовать строку списка для записи (звуковой файл). Строка списка должна быть выбрана для детализации и иметь кнопку воспроизведения. Итак, я получил 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 Ответ

5 голосов
/ 24 февраля 2012

Возможно, вам просто нужно установить userInteractionEnabled на YES на вашем RecordingView.

Другая проблема состоит в том, что вы создаете RecordingView с шириной кадра 130, но вы устанавливаете начало оси X от playButton до 185. Это означает, что playButton полностью находится за пределами его границ. SuperView. Значение по умолчанию для clipsToBounds равно NO, поэтому кнопка все равно будет нарисована. Но сенсорные события никогда не достигнут кнопки, потому что они отклоняются, когда система проверяет нажатие RecordingView.

Это из документации hitTest:withEvent: в Справочник по классам UIView :

Точки, находящиеся за пределами границ получателя, никогда не сообщаются как попадания, даже если они фактически лежат в одном из подпредставлений получателя. Это может произойти, если для свойства clipsToBounds текущего представления установлено значение NO и затронутое подпредставление выходит за границы представления.

Вам нужно либо расширить рамку RecordingView, либо переместить playButton, чтобы оказаться в пределах его суперпредставления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...