UIButton contacto se retrasa cuando en UIScrollView
-
30-09-2019 - |
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
.
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.
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