Pregunta

Me estoy quedando en un pequeño problema en mi aplicación.

I esencialmente tiene una serie de UIButtons añadido como subvistas en un UIScrollView que es parte de una punta. Cada vez que toque en un botón hay un retraso notable antes de que se resalte el botón. Esencialmente tengo que mantenerla durante aproximadamente medio segundo antes de que se atenúa y el botón aparece seleccionado.

Estoy asumiendo que esto se debe a las necesidades UIScrollView para determinar si el contacto es un desplazamiento o si es un contacto que está destinado para una vista secundaria.

De todas formas, yo soy un poco inseguro sobre cómo proceder. Simplemente quiero que aparezca el botón seleccionado tan pronto como tocar en ella.

Cualquier ayuda se agradece!

Editar

He intentado delaysContentTouches ajuste a NO , pero el desplazamiento se vuelve casi imposible, ya que la mayoría de mi ScrollView está lleno de UIButtons.

¿Fue útil?

Solución 2

Ok He resuelto este subclasificando UIScrollView y anulando touchesShouldCancelInContentView

Ahora mi UIButton que fue etiquetada como 99 destacados correctamente y mi ScrollView se desplaza!

myCustomScrollView.h

@interface myCustomScrollView : UIScrollView  {

}

@end

y myCustomScrollView.m

@implementation myCustomScrollView

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

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

Otros consejos

La solución de Jeff no era bastante trabajo para mí, pero éste hace similares: http://charlesharley.com/2013/programming/uibutton-in-uitableviewcell-has-no-highlight-state

Además de anular touchesShouldCancelInContentView en la vista de desplazamiento subclase, todavía necesidad de establecer delaysContentTouches a false. Por último, es necesario volver true en lugar de false para los botones. He aquí un ejemplo modificado desde el enlace anterior. Como comentaristas sugirieron, comprueba cualquier subclase de UIControl en lugar de UIButton específicamente para que este comportamiento se aplica a cualquier tipo de control.

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

Trate de conjunto de propiedades UIScrollView delaysContentTouches a NO.

solución Storyboard: Seleccione la vista de desplazamiento, abra el "Atributos Inspector" y desmarque "retrasos Toques contenido"

introducir descripción de la imagen aquí

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

A continuación, puede utilizar esta ScrollViewWithButtons en IB o en el código.

Ninguna de las soluciones existentes trabajó para mí. Tal vez mi situación es más único.

Tengo muchos UIButtons dentro de un UIScrollView. Cuando se pulsa un UIButton un nuevo UIViewController se presenta al usuario. Si se pulsa un botón y se mantiene el tiempo suficiente, el botón mostrará su estado depresivo. Mi cliente se quejaba de que si toca demasiado rápido, no se muestra ningún estado depresivo.

Mi solución: Dentro de la UIButtons' método del grifo, en el que cargar el nuevo UIViewController y presentarla en la pantalla, utilizo

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

Este programa la carga de la siguiente UIViewController en el siguiente bucle de eventos. tiempo para la UIButton volver a dibujar lo que permite. El UIButton muestra ahora su estado deprimido antes de cargar la próxima UIViewController.

Swift 3:

scrollView.delaysContentTouches = false
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top