2013-04-08 5 views
2

В течение последних четырех часов я пробовал много решений Stack Overlow, но ни один из них не помог решить мою проблему.Использование UILongPressGestureRecognizer для Subviews UIScrollview

Здесь,

  • У меня есть UIScrollView
  • В этом ScrollView есть один обычай UILabel и 8 пользовательских UIImageViews
  • Я хочу, чтобы обнаружить долгое нажатие
  • Что-то вроде этого работает

    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressDidFire:)];
    longPress.minimumPressDuration = 0.5; [scroll addGestureRecognizer:longPress]; //scroll defined elsewhere

Однако, если я заменю свиток с любыми подвидами из свитка, длинный пресс-событие не срабатывает.

  1. Как я обнаружить долгое нажатие на подвид из целей прокрутки?
  2. Это довольно грязный взломать, однако, поскольку я могу обнаружить длинные нажатия прокрутки, есть ли способ, которым я могу обнаружить положение пресса, чтобы я мог видеть, какое конкретное подзапрос нажимается на .

Кроме того, (insert subview here).userInteractionEnabled = YES я установить это свойство для всех моих подвидов в целях прокрутки, так что это не должно быть проблемой.

Я также пробовал использовать touchsBegan и touchsEnded, как было предложено в другом месте в Stack Overflow.

Кроме того, для представлений изображений, я установил новый UILongPressGestureRecognizer для каждого просмотра пользовательских изображений, используя цикл, как я осознает 1 зрения на жест распознаватель правил.

С первого раза IOS Developer,

Graham

P.S. Я действительно предпочитаю, если я мог бы найти решение 1. а не грязный 2.


Больше кодекса с просьбой:

В Init от вида контроллера

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressDidFire:)]; 
longPress.minimumPressDuration = 0.5; 
[self.titleLabel addGestureRecognizer:longPress]; //titleLabel property initialized elsewhere 
[mainView addSubview:self.titleLabel]; 

В способе "загрузки изображений"

for (NSData * dataImg in results) { 
//Does some work turning data into an image, into an image view called img 
     img.delegate = self; 
     img.userInteractionEnabled = YES; 
     UILongPressGestureRecognizer *aLongPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressDidFire:)]; 
     aLongPress.minimumPressDuration = 0.5; 
     [img addGestureRecognizer:aLongPress]; 
     [imgContainer addSubview:img]; 
} 

Еще больше Код + Примечания

self.вид (UIView)

-> прокрутки (UIScrollView)

-> -> MainView (UIView)

-> -> -> titleLabel (UILabel)

-> -> -> imgContainer (UIView)

-> -> -> -> изображения (UIImageViews)

[self.view addSubview:scroll]; 
[scroll addSubview:mainView]; 
[mainView addSubview:self.titleLabel]; 
[mainView addSubview:imgContainer]; 
[imgContainer addSubview:img]; //done 8x via for loop 

Благодаря ответу @ RegularExpression, теперь я знаю, что mainView получает нажатие, но не его subviews, поэтому мне нужно найти способ отображения надзовов mainView над ним. :)

Другое обновление, названиеLabel works. ImageViews все еще не работают. :(

+0

Как вы добавляете 'subViews' в' UIScrollView'? – TheTiger

+0

Загрузите код, дайте мне сек. Спасибо за помощь. @TheTiger – GangstaGraham

+0

Простите, что я неправильно вас понял ранее, теперь опубликовал, как я добавляю виды на свой scrollview @TheTiger – GangstaGraham

ответ

0

Woohoo это работает!

Проблема была:

imgContainer был UIView с пустой рамкой с несколькими UIImageViews, как подвиды

Я был под впечатлением, что, как я добавил подвид к imgContainer, imgContainer расширит ,

Это не верно.

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

Надеюсь, этот ответ поможет любым другим будущим таймерам iOS, таким как я.

+0

Что-то вроде вы играете в одиночку// Прежде всего, у нас нет кода, на который мы только что ответили, что вы спросили. Теперь взгляните на свой вопрос, может ли кто-нибудь дать ответ, как вы здесь дали? Я думаю ** НЕТ **, потому что вы знаете, что вы написали .... любым способом счастливого кодирования. – TheTiger

+0

Я не хотел быть неясным.Все вы хорошо поработали с тем, что было дано вам (хотя у вас в основном был тот же код, что и я). Тем не менее, я чувствую необходимость дать окончательный, реальный ответ, если кто-то пострадает от этой проблемы в будущем. @Тигр – GangstaGraham

0

Вместо

[scroll addGestureRecognizer:longPress]; 

Добавить жест на ваших подвидов, сразу после того, как их объявили и, прежде чем добавлять их в Scrollview

[subview addGestureRecognizer:longPress]; 
+1

Я пробовал это, к сожалению, он не работает. : P – GangstaGraham

+0

^Забыл отметить вас выше @mayuur – GangstaGraham

+0

Хорошо, не могли бы вы опубликовать, как вы добавляете взгляды внутри своего прокрутки? – mayuur

1

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

Итак, вы могли бы сделать что-то вроде этого:

- (void)longPressDidFire:(UILongPressGestureRecognizer *)sender 
{ 
    if (sender.state == UIGestureRecognizerStateEnded) 
     CGPoint point = [sender locationInView:scroll]; 
     UIView *tappedView = [scroll hitTest:point withEvent:nil]; 

Таким образом, то у вас есть мнение, что было давно нажиму.

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

НТН

+0

Это кажется интересным, @RegularExpression, я проверю его – GangstaGraham

+0

Но как бы вы нашли конкретный UIView, все, что он дает, это выделения памяти, так как есть 8 пользовательских UIImageViews, я не знаю, будет ли это работать. – GangstaGraham

+0

Спасибо, хотя это помогло мне разобраться, что mainView получает прослушивание, но не subviews mainView. Это было полезно! – GangstaGraham

1

ваш код, кажется, хорошо, она должна работать я think.i использовал ниже код и его работы хорошо для меня.

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)]; 
longPress.delegate = (id)self; 
longPress.minimumPressDuration=0.05; 
imageView.userInteractionEnabled = YES; 
[imageView addGestureRecognizer:longPress]; 

и его метод,

- (IBAction)handleLongPress:(UILongPressGestureRecognizer *)sender { 
    NSLog(@"detected"); 

if (sender.state == UIGestureRecognizerStateEnded){ 
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Alert" message:@"YES" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; 
    [alert show]; 
    } 
} 

Здесь я взял ImageView, как подвид из Scrollview, как у сказал

+0

Спасибо, я разместил свой код выше, он очень похож на ваш, кроме (id) self. Но, к сожалению, это не сработает. @murali – GangstaGraham

+0

Как у вас добавить subview jst может у меня показать? – iSpark

+0

жаль, что я неправильно вас понял ранее, теперь опубликовал, как я добавляю виды в свой scrollview @murali – GangstaGraham

7

Я знаю, что это немного запоздало, и был выбран ответ, но если кто-то захочет иметь приятное простое решение, если у вас есть iOS7.

Внутри вашего делегата UILongPressGestureRecognizer реализации gestureRecognizer: shouldRequireFailureOfGestureRecognizer: otherGestureRecognizer селекторного

Проверьте otherGestureRecognizer является UIPanGestureRecognizer и вернуть YES, в противном случае не возвращают

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 
    if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) { 
     return YES; 
    } 

    return NO; 
} 

В представлении прокрутки на самом деле будет создан UIScrollViewPanGestureRecognizer, который является частью частного API, но он является подклассом UIPanGestureRecognizer, так что это работает отлично.

Для поддержки iOS6 или ниже, то вам нужен петля через gestureRecognizers в UIScrollView, обнаружение которых один является UIPanGestureRecognizer и выполнить селектор requireGestureRecognizerToFail на вашем UILongPressGestureRecogizer с этим.

Смежные вопросы