ScrollView жэст распознаватель ядуць усе падзеі дотыку

У мяне ёсць UIScrollView , да якога я дадаў адзін кран жэст распознаватель, каб паказаць/схаваць некаторыя UI накладку з дапамогай:

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[scrollView addGestureRecognizer:singleTap];

а таксама:

- (void)handleTap:(UITapGestureRecognizer *)sender {
   //report click to UI changer
}

Я дадаў лёгкі прагляд табліцы у ніжняй частцы UIScrollView . Усё працуе (пракрутка па гарызанталі і па вертыкалі), але праблема ў тым, што краны распазнаюцца толькі жэст распознаватель (вышэй), але не па лёгкай таблічным. Калі выдаліць радок, якая рэгіструе жэст слухач, усё працуе выдатна, выгляд апавяшчэнне табліцы стукае па сабе.

Гэта як калі функцыя распазнання жэсту «з'ядае» па ТКП падзей на таблічным і не пашырае іх уніз.

Любая дапамога вітаецца

30

16 адказы

This should solve your problem.
Detect touch event on UIScrollView AND on UIView's components [which is placed inside UIScrollView]
The idea is to tell the gesture recognizer to not swallow up the touch events. To do this you need to set singleTap's cancelsTouchesInView property to NO, which is YES by default.

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
singleTap.cancelsTouchesInView = NO;
[scrollView addGestureRecognizer:singleTap]; 
69
дададзена
У мяне аналагічная праблема ( маё пытанне ) але рашэнне не працуе для мяне. Часам падзея спрацоўвае, часам не.
дададзена аўтар new2ios, крыніца
singleTap.cancelsTouchesInView = NO; Дзякуючы Bro !! гэта рашэнне дапамагае мне ў выглядзе табліцы, каб прадухіліць itrrupting падзеі UITouch
дададзена аўтар Abhishek Thapliyal, крыніца
Гэта зрабіў трук :)
дададзена аўтар Itai Hanski, крыніца
што адзін з'яўляецца канчатковым solution.thanks zambrey
дададзена аўтар Muhammad Awais Salim, крыніца

This should solve your problem.
Detect touch event on UIScrollView AND on UIView's components [which is placed inside UIScrollView]
The idea is to tell the gesture recognizer to not swallow up the touch events. To do this you need to set singleTap's cancelsTouchesInView property to NO, which is YES by default.

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
singleTap.cancelsTouchesInView = NO;
[scrollView addGestureRecognizer:singleTap]; 
69
дададзена
У мяне аналагічная праблема ( маё пытанне ) але рашэнне не працуе для мяне. Часам падзея спрацоўвае, часам не.
дададзена аўтар new2ios, крыніца
singleTap.cancelsTouchesInView = NO; Дзякуючы Bro !! гэта рашэнне дапамагае мне ў выглядзе табліцы, каб прадухіліць itrrupting падзеі UITouch
дададзена аўтар Abhishek Thapliyal, крыніца
Гэта зрабіў трук :)
дададзена аўтар Itai Hanski, крыніца
што адзін з'яўляецца канчатковым solution.thanks zambrey
дададзена аўтар Muhammad Awais Salim, крыніца

<�Моцны> Swift 3.0 </моцны>

 let singleTap = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
 singleTap.cancelsTouchesInView = false
 singleTap.numberOfTapsRequired = 1
 scrollView.addGestureRecognizer(singleTap)

І метады выбару быць.

func handleTap(_ recognizer: UITapGestureRecognizer) {
 //Perform operation
}
9
дададзена
Ідэальнае рашэнне!
дададзена аўтар DJ-Glock, крыніца

<�Моцны> Swift 3.0 </моцны>

 let singleTap = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:)))
 singleTap.cancelsTouchesInView = false
 singleTap.numberOfTapsRequired = 1
 scrollView.addGestureRecognizer(singleTap)

І метады выбару быць.

func handleTap(_ recognizer: UITapGestureRecognizer) {
 //Perform operation
}
9
дададзена
Ідэальнае рашэнне!
дададзена аўтар DJ-Glock, крыніца

Вы можаце ўсталяваць, якія аб'екты павінны быць уключаны/выключаны для дакрананняў.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch {            
   if (touch.view == [self view]) {
       return YES;
   }
   return NO;
}
6
дададзена

Вы можаце ўсталяваць, якія аб'екты павінны быць уключаны/выключаны для дакрананняў.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gesture shouldReceiveTouch:(UITouch *)touch {            
   if (touch.view == [self view]) {
       return YES;
   }
   return NO;
}
6
дададзена

Я думаю, што прычына ў тым, што Узаемадзеянне з карыстальнікам Уключана усталяваны ў становішча False для UIImageView. Вы павінны ўсталяваць яго на праўдзівы, каб уключыць у яго націснуўшы

5
дададзена

Я думаю, што прычына ў тым, што Узаемадзеянне з карыстальнікам Уключана усталяваны ў становішча False для UIImageView. Вы павінны ўсталяваць яго на праўдзівы, каб уключыць у яго націснуўшы

5
дададзена

This worked for me in Swift 3/Xcode 8

    self.scrollView.touchesShouldCancel(in: ** the view you want the touches in **)
    self.scrollView.canCancelContentTouches = false

Поспехаў!

2
дададзена
Замест таго, каб пакінуць гэтую частку інфармацыі ў каментарах, калі ласка, рэдагаваць вашага адказу і дадаць яго прама там, а затым выдаліць каментар. Вы таксама можаце злавіць магчымасць зафіксаваць водступы (фарматавання коды з Markdown патрабуецца 4 месцы, але ў вас ёсць 8, што прыводзіць да непатрэбнага дадатковым ўзроўню водступу). Дзякуй!
дададзена аўтар Fabio Turati, крыніца

This worked for me in Swift 3/Xcode 8

    self.scrollView.touchesShouldCancel(in: ** the view you want the touches in **)
    self.scrollView.canCancelContentTouches = false

Поспехаў!

2
дададзена
Замест таго, каб пакінуць гэтую частку інфармацыі ў каментарах, калі ласка, рэдагаваць вашага адказу і дадаць яго прама там, а затым выдаліць каментар. Вы таксама можаце злавіць магчымасць зафіксаваць водступы (фарматавання коды з Markdown патрабуецца 4 месцы, але ў вас ёсць 8, што прыводзіць да непатрэбнага дадатковым ўзроўню водступу). Дзякуй!
дададзена аўтар Fabio Turati, крыніца

дзякуючы @zambrey

<�Моцны> Swift 2.2+ Версія:

scrollView.delegate = self

let allowMultipleTouches = UITapGestureRecognizer(target: self, action: #selector(genderPressed))
allowMultipleTouches.numberOfTapsRequired = 1
allowMultipleTouches.cancelsTouchesInView = false

scrollView.addGestureRecognizer(allowMultipleTouches)

Калі ваш погляд пракруткі ў раскадроўкі, не забудзьцеся прымацаваць разетка ў кантролеры прадстаўлення. У гэтым прыкладзе, Scrollview гэта на выхадзе з UIScrollView .

2
дададзена

дзякуючы @zambrey

<�Моцны> Swift 2.2+ Версія:

scrollView.delegate = self

let allowMultipleTouches = UITapGestureRecognizer(target: self, action: #selector(genderPressed))
allowMultipleTouches.numberOfTapsRequired = 1
allowMultipleTouches.cancelsTouchesInView = false

scrollView.addGestureRecognizer(allowMultipleTouches)

Калі ваш погляд пракруткі ў раскадроўкі, не забудзьцеся прымацаваць разетка ў кантролеры прадстаўлення. У гэтым прыкладзе, Scrollview гэта на выхадзе з UIScrollView .

2
дададзена

You can capture any kind of gestures in the UIscrollView. Make sure you also handle some of the default properties as well like set cancelsTouchesInView property to false, it is true by default. Also give some tag nos to your sub views to distinguish in selectors. & also enable their User interaction to true.

<�Р> хай вадаправодная = UITapGestureRecognizer (мэта: самасць, дзеянне:      

Селектар (didTapByUser (_)))

1
дададзена

You can capture any kind of gestures in the UIscrollView. Make sure you also handle some of the default properties as well like set cancelsTouchesInView property to false, it is true by default. Also give some tag nos to your sub views to distinguish in selectors. & also enable their User interaction to true.

<�Р> хай вадаправодная = UITapGestureRecognizer (мэта: самасць, дзеянне:      

Селектар (didTapByUser (_)))

1
дададзена

TapGestures працаваў для мяне. Каромысел з другога боку, мне прыйшлося адключыць скролінг, і яна працавала.

     swipeLeftGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeToNewImage(_:)))
     swipeLeftGesture.direction = .left
     scrollView.addGestureRecognizer(swipeLeftGesture)

     swipeRightGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeToNewImage(_:)))
     scrollView.addGestureRecognizer(swipeRightGesture)

    scrollView.isScrollEnabled = false
1
дададзена

TapGestures працаваў для мяне. Каромысел з другога боку, мне прыйшлося адключыць скролінг, і яна працавала.

     swipeLeftGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeToNewImage(_:)))
     swipeLeftGesture.direction = .left
     scrollView.addGestureRecognizer(swipeLeftGesture)

     swipeRightGesture = UISwipeGestureRecognizer(target: self, action: #selector(swipeToNewImage(_:)))
     scrollView.addGestureRecognizer(swipeRightGesture)

    scrollView.isScrollEnabled = false
1
дададзена