UIButton berühren wird, wenn in UIScrollView verzögert
-
30-09-2019 - |
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.
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.
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