Domanda

Io corro in un piccolo problema nella mia app.

I essenzialmente ha una serie di UIButtons aggiunto come subviews in UIScrollView che fa parte di un pennino. Ogni Ho tap tempo su un pulsante c'è un ritardo notevole prima che il pulsante è evidenziato. Ho in sostanza devo tenerlo premuto per circa mezzo secondo prima che le si affievolisce e pulsante appare selezionato.

Sto assumendo questo è perché le esigenze UIScrollView per determinare se il tocco è un rotolo o se si tratta di un tocco che si intende per una visualizzazione secondaria.

In ogni modo, io sono un po 'incerto su come procedere. Voglio semplicemente il pulsante per apparire selezionato, non appena si tocca di esso.

Ogni aiuto è apprezzato!

Modifica

Ho provato a installare delaysContentTouches a NO , ma lo scorrimento diventa quasi impossibile, poiché la maggior parte della mia ScrollView è pieno di UIButtons.

È stato utile?

Soluzione 2

Ok ho risolto questo sottoclassi UIScrollView e sovrascrivendo touchesShouldCancelInContentView

Ora la mia UIButton che è stato etichettato come 99 evidenzia correttamente e la mia ScrollView scorre!

myCustomScrollView.h :

@interface myCustomScrollView : UIScrollView  {

}

@end

e myCustomScrollView.m :

@implementation myCustomScrollView

    - (BOOL)touchesShouldCancelInContentView:(UIView *)view
    {
        NSLog(@"touchesShouldCancelInContentView");

        if (view.tag == 99)
            return NO;
        else 
            return YES;
    }

Altri suggerimenti

La soluzione di Jeff non è stato del tutto lavorando per me, ma questo si fa simile: http://charlesharley.com/2013/programming/uibutton-in-uitableviewcell-has-no-highlight-state

Oltre a override touchesShouldCancelInContentView in vista di scorrimento sottoclasse, è comunque necessario delaysContentTouches insieme a false. Infine, è necessario tornare true piuttosto che false per i pulsanti. Ecco un esempio modificato dal link qui sopra. Come commentatori hanno suggerito, esso controlla per qualsiasi sottoclasse di UIControl piuttosto che UIButton appositamente in modo che questo comportamento si applica a qualsiasi tipo di controllo.

Objective-C:

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        self.delaysContentTouches = false;
    }

    return self;
}

- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
    if ([view isKindOfClass:UIControl.class]) {
        return true;
    }

    return [super touchesShouldCancelInContentView:view];
}

Swift 4:

override func touchesShouldCancel(in view: UIView) -> Bool {
    if view is UIControl {
        return true
    }
    return super.touchesShouldCancel(in: view)
}

Cerca di insieme di proprietà UIScrollView delaysContentTouches su NO.

soluzione Storyboard: Selezionare la vista di scorrimento, aprire il "Attributi" e deselezionare "ritardi Touches contenuti"

entrare descrizione dell'immagine qui

In Swift 3:

import UIKit

class ScrollViewWithButtons: UIScrollView {

    override init(frame: CGRect) {
        super.init(frame: frame)
        myInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        myInit()
    }

    private func myInit() {
        self.delaysContentTouches = false
    }

    override func touchesShouldCancel(in view: UIView) -> Bool {
        if view is UIButton {
            return true
        }
        return super.touchesShouldCancel(in: view)
    }
}

È quindi possibile utilizzare questo ScrollViewWithButtons in IB o nel codice.

Nessuna delle soluzioni esistenti ha funzionato per me. Forse la mia situazione è più unico.

Ho molti UIButtons all'interno di un UIScrollView. Quando si preme un UIButton una nuova UIViewController viene presentato all'utente. Se un pulsante viene tenuto premuto abbastanza a lungo, il pulsante mostrerà il suo stato di depressione. Il mio cliente si lamentava che se si tocca troppo in fretta, nessuno stato depresso è mostrato.

La mia soluzione: All'interno del UIButtons' metodo di rubinetto, in cui si carica il nuovo UIViewController e presente sullo schermo, io uso

[self performSelector:@selector(loadNextScreenWithOptions:) 
           withObject:options 
           afterDelay:0.]

Questa orari del carico del prossimo UIViewController sul prossimo ciclo di eventi. tempo per il UIButton per ridisegnare permettendo. La UIButton ora mostra il suo stato di depressione prima di caricare il successivo UIViewController.

Swift 3:

scrollView.delaysContentTouches = false
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top