Кнопка UIB, которую я не могу потрогать - PullRequest
1 голос
/ 17 января 2012

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

    UIPickerView *tempPickerView = [[[UIPickerView alloc] initWithFrame:
        CGRectMake(kPickerViewX, kPickerViewY, kPickerViewWidth, kPickerViewHeight)] autorelease];
    tempPickerView.showsSelectionIndicator = YES;
    tempPickerView.delegate = self;
    tempPickerView.dataSource = self;
    UIButton *pickerButton = [[UIButton alloc] initWithFrame:CGRectMake(0, -32, 52, 32)];
    [pickerButton setBackgroundImage:[UIImage imageNamed:@"week.png"] 
         forState:UIControlStateNormal];
    [pickerButton addTarget:self action:@selector(hidePicker) 
         forControlEvents:UIControlEventTouchUpInside];
    [tempPickerView addSubview:pickerButton];
    [tempPickerView bringSubviewToFront:pickerButton];
    [pickerButton release];

    [self.view addSubview:tempPickerView];
    return tempPickerView;

, и это выглядит так:

enter image description here

эта кнопка находится в левом верхнем углу окна выбора, забудьте о «неделе», это просто временное имя.

Проблема в том, что я не могу нажать эту кнопку, каждый раз, когда я пытался коснутьсяэто, я просто непосредственно коснулся вещей позади него, таких как talbeViewCell.

Является ли это, потому что я добавил кнопку за пределами кадра pickerView?

Я имею в виду, что координата источника кнопки (0, -32),

, чтобы он отображался над панелью выбора, есть ли проблемы с координатой?

Кто-нибудь может подсказать, как решить эту проблему?

Спасибо большое и большое !!!

Ответы [ 2 ]

5 голосов
/ 17 января 2012

Проблема в том, что вы поместили кнопку за пределы родительского представления. iOS теперь делает это (упрощенно, не на 100% правильно, но вы получите предложение):

  • Он замечает, что произошло касание. Он рассчитывает координаты этого прикосновения.
  • Затем он пытается выяснить, какой вид был затронут. Для этого он вызывает метод hitTest:withEvent: объекта UIWindow вашего приложения.
  • Это, в свою очередь, вызывает hitTest:withEvent: для каждого из его дочерних элементов, и каждый из них вызывает hitTest:withEvent: для своих дочерних элементов, если необходимо.
  • Когда вызывается hitTest:withEvent: вида, он сначала смотрит, находится ли координата в пределах его собственных границ (IIRC). Если это не так, он возвращает nil. В противном случае он вызывает hitTest:withEvent: для своих детей.

Документация hitTest:withEvent: прямо говорит:

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

Проблема в том, что ваша кнопка находится за пределами родительского представления. Таким образом, hitTest:withEvent: определяет, что координата касания не находится в пределах границ окна выбора, и никогда не спрашивает своего дочернего элемента (кнопки), ударить ли его.

Вы можете создать подкласс средства выбора и переопределить метод hitTest:withEvent:, чтобы «исправить» это, но реальное исправление состоит в том, чтобы переместить кнопку так, чтобы она была родственником сборщика, а не дочерним элементом.

1 голос
/ 17 января 2012

Я думаю, что это может быть вызвано методом проверки попаданий UIPickerView. Он может вернуть NO из pointInside:withEvent:, если касание находится за его пределами. В заголовке файла (UIView.h) комментария написано

по умолчанию возвращает ДА, если точка находится в границах

Поскольку вы размещаете кнопку за пределами UIPickerView, это вполне может быть причиной.

В качестве обходного пути вы можете вставить кнопку в суперпредставление сборщика.

...