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.

Était-ce utile?

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.

Solution Storyboard: Sélectionnez la vue de défilement, ouvrez le « Attributs inspecteur » et décocher « Retarde contenu Touches »

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top