contact UIButton est retardée lorsque dans UIScrollView
-
30-09-2019 - |
Question
Je suis en cours d'exécution dans un petit problème dans mon application.
I ont essentiellement une série de UIButtons
ajouté en tant que sous-vues dans un UIScrollView
qui fait partie d'une plume. Chaque fois que je tape sur un bouton il y a un retard notable avant que le bouton est mis en surbrillance. J'ai essentiellement pour le maintenir pendant environ une demi-seconde avant que le bouton DiMS et sélectionné apparaît.
Je suppose que cela est parce que les besoins de UIScrollView
pour déterminer si le contact est un rouleau ou si elle est une touche qui est destiné à une sous-vue.
Quoi qu'il en soit, je suis un peu incertain sur la façon de procéder. Je veux simplement le bouton pour soit activée dès que je tapote.
Toute aide est appréciée!
Modifier
J'ai essayé de placer delaysContentTouches
NON , mais le défilement devient presque impossible puisque la majorité de mon ScrollView est rempli de UIButtons
.
La solution 2
Ok je l'ai résolu ce problème en sous-classement UIScrollView
et en remplaçant touchesShouldCancelInContentView
Maintenant, mon UIButton
qui a été marqué comme 99 points culminants correctement et mon scrollview défile!
myCustomScrollView.h :
@interface myCustomScrollView : UIScrollView {
}
@end
et myCustomScrollView.m :
@implementation myCustomScrollView
- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
NSLog(@"touchesShouldCancelInContentView");
if (view.tag == 99)
return NO;
else
return YES;
}
Autres conseils
La solution de Jeff ne fonctionnait pas tout à fait pour moi, mais celui-ci même fait: http://charlesharley.com/2013/programming/uibutton-in-uitableviewcell-has-no-highlight-state
En plus de remplaçant touchesShouldCancelInContentView
dans votre sous-classe de vue de défilement, vous avez encore besoin de mettre delaysContentTouches
à false
. Enfin, vous devez revenir true
plutôt que false
pour vos boutons. Voici un exemple modifié à partir du lien ci-dessus. Comme suggéré, il commenters vérifie une sous-classe de UIControl
plutôt que UIButton
spécifiquement pour que ce comportement s'applique à tout type de contrôle.
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)
}
Essayez de définir la propriété UIScrollView de delaysContentTouches
NO.
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)
}
}
Vous pouvez ensuite utiliser ce ScrollViewWithButtons
dans IB ou dans le code.
Aucune des solutions existantes a fonctionné pour moi. Peut-être que ma situation est plus unique.
J'ai beaucoup UIButtons
dans un UIScrollView
. Lorsqu'un UIButton
est pressé est présenté une nouvelle UIViewController
à l'utilisateur. Si un bouton est maintenu enfoncé assez longtemps, le bouton montrera son état dépressif. Mon client se plaignait que si vous appuyez trop rapidement, aucun état dépressif est affiché.
Ma solution:
A l'intérieur du UIButtons
» méthode du robinet, où je charge la nouvelle UIViewController
et de le présenter à l'écran, j'utilise
[self performSelector:@selector(loadNextScreenWithOptions:)
withObject:options
afterDelay:0.]
Ce programme le chargement de la prochaine UIViewController
sur la prochaine boucle d'événements. Laissant le temps au UIButton
de redessiner. Le UIButton
montre maintenant son état dépressif avant de charger la prochaine UIViewController
.
Swift 3:
scrollView.delaysContentTouches = false