Domanda

Io uso UIScrollView per fare di grandi dimensioni (più grande di 320px) UI su iPhone.

Ho fatto un'istanza di UIScrollView e aggiunto alcuni subviews su di esso. Il problema è che voglio per consentire lo scorrimento solo quando l'utente tocca al di fuori di subviews, interrompere lo scorrimento quando l'utente tocca uno dei subviews.

Ho letto i documenti e ho cercato di trovare i campioni, ma non riesco a trovare un buon suggerimento. Se avete qualche idea, ti prego, aiutami.

È stato utile?

Soluzione

Se si desidera rilevare tocchi all'interno di qualsiasi delle subviews del UIScrollView, dovrete sottoclasse UIScrollView e sovrascrivere i metodi touchesShouldBegin e touchesShouldCancelInContentView che sono specificamente creati per questo scopo.

Oltre a questo, non c'è modo è possibile identificare tocchi nelle subviews come UIScrollView tende a gestire tutti i tocchi di per sé e non li passa ai suoi subviews.

Tutto il meglio.

Altri suggerimenti

UIScrollView ha una scrollEnabled proprietà che permette di disabilitare lo scorrimento programatically. Essa ha anche un delegato (UIScrollViewDelegate) che permette di vedere eventi quali lo scorrimento di partenza / finale. Sembra che si dovrebbe essere in grado di cucinare qualcosa con quelle opzioni combinate in qualche modo.

La proprietà si è veramente interessato a - e sto davvero testare questo fuori in questo momento, perché ho lo stesso problema si fa - è canCancelContentTouches.

  

Se il valore di questa proprietà è NO,   la vista di scorrimento non scorre   indipendentemente dal movimento delle dita una volta che il   view inizio del contenuto di tracciamento.

Se questo non ti dà i risultati desiderati, sottoclasse UIScrollView e l'override del metodo touchesShouldBegin:withEvent:inContentView, che è ciò che la risposta accettata suggerisce.

Il modo più semplice per farlo è impostato per delayContentTouches NO per lo ScrollView. In questo modo il comportamento di default è impostata in modo che tutto ciò che è un'UIControl passerà i tocchi al controllo immediatamente andeverything altro sarà scorrere.

Puoi anche sublcass UIScrollViewController e sovrascrivere il touchesBegan, touchesMoved e touchesEnded metodi. Se l'implementazione non chiama mai l'implementazione della superclasse, allora non scorrerà.

Il mio problema stava avendo una vista che un utente potrebbe attirare, ma la vista di scorrimento è stato dirottamento il tocco e lo scorrimento invece di disegno. Questa è la mia soluzione di lavoro:

A mio avviso disegno ho:

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    // Disable scroll on touch begin
    setContainerScrollingEnabled(false)
    super.touchesBegan(touches, with: event)
}

override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

    // Reenable scroll on touch end
    setContainerScrollingEnabled(true)
    super.touchesEnded(touches, with: event)
}

private func setContainerScrollingEnabled(_ enabled: Bool) {

    // loop up superviews to find the scrollview
    func scrollingSuperview(of view: UIView) -> UIScrollView? {
        guard let superview = view.superview else { return nil }
        if let scrolling = view.superview as? UIScrollView { return scrolling }
        return scrollingSuperview(of: superview)
    }

    // and switch on/off scrolling
    let scrollView = scrollingSuperview(of: self)
    scrollView?.isScrollEnabled = enabled
}

e nel controller della vista che contiene la vista di scorrimento che ho:

// Not sure what exactly this does, but I think it allows the drawing view to have precedence. This was the missing piece of the puzzle.
scrollView.delaysContentTouches = false
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top