Делаем область UIImage / UIScrollView «кликабельной» - PullRequest
2 голосов
/ 19 мая 2011

Итак, мне нужно решить две проблемы:

  1. Обнаружить щелчок по области в UIImageView.
  2. Обнаружить щелчок по области в UIScrollView.

Я думаю об обоих, так как у меня есть координаты x / y от клиента, я собираюсь программно создать экземпляр UIButton (пользовательский / прозрачный) и поместить его над требуемой областью для UIImageView &UIScrollViews.

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

- (IBAction) btnPress:(id)sender

, поэтому я могу запросить отправителя

 [sender tag]

, а затем принимать решения на основе тега.Каждая кнопка будет иметь уникальный идентификатор.Мои вопросы:

  1. Это хороший способ сделать это?Что было бы лучше?
  2. Я знаю, как делать все эти вещи в IB, но не программно.У меня сложилось впечатление, что соединения (для IBActions) выполняются только в IB, так как я могу подключить кнопку к событию со всем кодом (я сейчас начну гуглить).

TIA.

1 Ответ

4 голосов
/ 19 мая 2011

Если вы хотите использовать UIB-кнопку для обработки касаний, вы действительно можете создать пользовательскую кнопку для размещения над рамкой. Если вы выберете этот путь, чтобы применить метод к кнопке, вы должны сделать следующее:

UIButton *myButton = [UIButton buttonWithType:....];
myButton.tag = // your tag;
[myButton addTarget:self action:@selector(btnPress:) forControlEvents:UIControlEventTouchUpInside];

Тогда, когда вы захотите вызвать метод, это будет метод IBAction, как и следовало ожидать.

- (IBAction)btnPress:(id)sender {

, где [sender tag] действительно заставит указанную кнопку работать так, как вы хотите.

При этом, я мог бы быть более склонен настроить UIGestureRecognizer для представлений. По сути, вы должны пометить свой UIImageView и / или UIScrollView, а затем создать распознаватель жестов:

UITapGestureRecognizer *myGesture = [[UITapGestureRecognizer alloc] init];
[myGesture addTarget:self action@selector(frameTouched:)];
// for the case of the imageView;
[myImageView addGestureRecognizer:myGesture];
[myGesture release];

Затем, чтобы обработать жест,

- (void)frameTouched:(UIGestureRecognizer *)gesture {
    int myLogicTag = [[gesture view] tag];  // this finds the tag of the view it embodies, in this case your imageView
    // continue with your code;
}

Конечно, если у вас есть пользовательские классы scrollView или imageView, вы можете просто переопределить метод touchesBegan и делать то, что вы хотите оттуда. Я думаю, что это должно охватить ваши варианты довольно хорошо, поэтому я надеюсь, что это поможет

...