2012-03-05 6 views
4

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

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

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

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

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

ответ

7

установки canCancelContentTouches в scrollView к NO и delaysContentTouches к YES Try.

EDIT:

Я вижу, что похож вопрос был дан здесь Drag & sweep with Cocoa on iPhone (ответ точно такой же).

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

Если пользователь быстро пробирается через signView, тогда UIScrollView берет на себя.

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

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

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

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

Если это приложение-поведение (0.3-0.5s задержка) является неприемлемым, то вы также должны создать подкласс UIScrollView. Там способ спасения Vignesh's UIScrollView 's touchesShouldBegin: может на помощь. Там вы можете обнаружить, что прикосновение касалось signView и сразу же передало его этому виду.

+0

Thanx rokjarc. Хотя, когда я пытался подписать вид, иногда просмотр прокручивается, но все же его лучше, чем предыдущее условие, когда мне не удалось нарисовать даже короткую строку на представлении. Если вы знаете, как лучше подписаться, пожалуйста, предложите мне изменения, которые я должен сделать, чтобы добиться этого. – anshul

+0

@anshul: Я не нахожусь в маке в этот момент, поэтому я ничего не могу проверить. я отвечу, как только смогу –

+0

ya sure buddy .... будет ждать вашего отредактированного ответа .... Thanx много – anshul

3

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

0

Мы достигли этого с помощью подкласса 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 
    } 
}