Frage

Ich laufe in ein kleines Problem in meiner Anwendung.

Ich habe im Wesentlichen eine Reihe von UIButtons als Subviews in einem UIScrollView hinzugefügt, den Teil einer Feder ist. Jedes Mal, wenn ich tippen Sie auf eine Schaltfläche gibt es eine erhebliche Verzögerung, bevor die Taste hervorgehoben. Ich habe es im Wesentlichen vor den Knopf dims für etwa eine halbe Sekunde zu halten und jetzt markiert.

ich dies unter der Annahme, weil die UIScrollView Bedürfnisse zu bestimmen, ob die Berührung eine Schnecke ist, oder wenn es eine Note, die für ein Subview gemeint ist.

Wie auch immer, ich bin ein wenig unsicher, wie zu verfahren. Ich mag einfach die Schaltfläche ausgewählt erscheinen, sobald ich es tippen.

Jede Hilfe ist willkommen!

Edit:

Ich habe versucht Einstellung delaysContentTouches auf NO aber Scrollen fast unmöglich wird, da eine Mehrheit meiner Scrollview mit UIButtons gefüllt ist.

War es hilfreich?

Lösung 2

Ok Ich habe löste dies durch Subklassen UIScrollView und zwingenden touchesShouldCancelInContentView

Nun meine UIButton, die als 99 Highlights markiert wurde richtig und meine Scroll rollt!

myCustomScrollView.h :

@interface myCustomScrollView : UIScrollView  {

}

@end

und myCustomScrollView.m :

@implementation myCustomScrollView

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

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

Andere Tipps

Jeffs Lösung funktioniert nicht ganz für mich, aber dies ähnlich tut: http://charlesharley.com/2013/programming/uibutton-in-uitableviewcell-has-no-highlight-state

Neben zwingende touchesShouldCancelInContentView in Ihrer Ansicht blättern Unterklasse, müssen Sie noch Satz delaysContentTouches zu false. Schließlich müssen Sie true anstatt false für Ihre Tasten zurückzukehren. Hier ist ein modifiziertes Beispiel aus dem obigen Link. Wie commen vorgeschlagen, sondern es Kontrollen für jede Unterklasse von UIControl als UIButton speziell so, dass dieses Verhalten auf jede Art von Kontrolle gilt.

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)
}

Versuchen Sie, Satz UIScrollView delaysContentTouches Eigenschaft auf NO.

Storyboard-Lösung: die Scroll-Ansicht wählen, öffnen Sie die „Attribute Inspector“ und deaktivieren Sie „Verzögert Inhalt Touches“

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)
    }
}

Sie können dann diese ScrollViewWithButtons in IB verwenden oder im Code.

Keine der existierenden Lösungen für mich gearbeitet. Vielleicht ist meine Situation einzigartig.

Ich habe viele UIButtons innerhalb eines UIScrollView. Wenn ein UIButton ein neues UIViewController gedrückt wird, wird dem Benutzer präsentiert. Wenn eine Taste gedrückt wird und lange genug gehalten wird, wird der Button seinen gedrückten Zustand zeigen. Mein Kunde beschwerte sich, dass, wenn Sie zu schnell tippen, kein niedergedrückten Zustand gezeigt wird.

Meine Lösung: Im Innern der UIButtons‘Tap-Methode, wo ich die neue UIViewController laden und auf dem Bildschirm darzustellen, verwende ich

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

Diese Zeitplan des Laden des nächsten UIViewController auf der nächsten Ereignisschleife. So dass genügend Zeit für die UIButton neu zu zeichnen. Die UIButton zeigt nun seine depressiven Zustand, bevor der nächste UIViewController geladen werden.

Swift 3:

scrollView.delaysContentTouches = false
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top