касается методов, не вызываемых в UIView, размещенном внутри UIScrollView - PullRequest
4 голосов
/ 05 марта 2012

У меня есть пользовательский вид прокрутки, подклассы UIScrollView.Я добавил представление прокрутки в моем nib-файле viewcontroller и изменил его класс на CustomScrollView.Теперь этот пользовательский вид прокрутки (сделанный из xib) добавлен как подпредставление в self.view.

В этом представлении прокрутки у меня есть 3 текстовых поля и 1 UIImageView (названный signImageView), добавленный из xib.При нажатии UIImageView (добавлено TapGestureRecogniser) в настраиваемый вид прокрутки добавляется UIView с именем signView.Я хочу разрешить Пользователю подписывать это представление, поэтому я создал класс Signature.m и .h с подклассами UIView и реализовал методы touch (touchesBegan, touchesMoved и touchesEnded) и инициализировал signView следующим образом:

signView = [[Signature alloc]initWithFrame:signImageView.frame];
    [customScrollView addSubview:signView];

Но когда я начинаю подписывать в signView, представление прокручивается, и, следовательно, методы прикосновения не вызывают.

Я попытался добавить signView в self.view вместо пользовательского представления прокрутки, но в этом случае вид остается приклеенным к фиксированной позиции, когда я начинаю прокручивать.(Его рамка остается фиксированной в этом случае)

Ответы [ 3 ]

7 голосов
/ 05 марта 2012

Попробуйте установить canCancelContentTouches из scrollView в NO и delaysContentTouches в YES.

РЕДАКТИРОВАТЬ:

Я вижу, что это похожеЗдесь можно получить ответ на вопрос Перетащите и разверните Какао на iPhone (ответ точно такой же).

Если пользователь нажимает на кнопку-101, то удерживает signView (примерно 0,3-0,5).секунд) затем вызывается метод touchesBegan: представления, и все события с этого момента переходят к signView до вызова touchesEnded:.

Если пользователь быстро проведет пальцем по signView, тогда UIScrollViewover.

Поскольку у вас уже есть подкласс UIView с реализованным методом touchesBegan:, возможно, вы могли бы как-то указать пользователю, что ваше приложение готово к тому, что он подпишет (' green light ' эквивалент).

Вы также можете использовать touchesEnded:, чтобы отключить зеленый свет .

Возможно, было бы лучше, если бы вы добавили signImageView как subView из signView (вместо customScrollView) и скрыли его при срабатывании touchesBegan:).Вы бы добавили signView к customScrollview в том же месте, где вместо этого добавили signImageView в существующий код.

С этим вы добьетесь, что на этом месте фактически будет только один subView (для лучшегоэффективность передачи касаний. Этого эффекта зеленого света можно добиться, если скрыть signImageView в touchesBegan:/touchesEnded:

Если такое поведение приложения (задержка 0,3-0,5 с) неприемлемотогда вам также нужно будет создать подкласс UIScrollView. Там может помочь метод переопределения UIScrollView touchesShouldBegin:, полученный от Виньеша. Там вы могли бы обнаружить, было ли касание, полученное в signView, и передать его этому виду.немедленно.

3 голосов
/ 05 марта 2012

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

0 голосов
/ 25 октября 2017

Мы достигли этого с помощью подкласса UIScrollView, который отключает средство распознавания жестов панорамирования для списка представлений, которые вы предоставляете.

class PanGestureSelectiveScrollView: UIScrollView {

  var disablePanOnViews: [UIView]?

  override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    guard let disablePanOnViews = disablePanOnViews else {
      return super.gestureRecognizerShouldBegin(gestureRecognizer)
    }

    let touchPoint = gestureRecognizer.location(in: self)
    let isTouchingAnyDisablingView = disablePanOnViews.first { $0.frame.contains(touchPoint) } != nil

    if gestureRecognizer === panGestureRecognizer && isTouchingAnyDisablingView {
      return false
    }
    return true
  }
}
...