UIButton no se destaca en ViewController en UIPageViewController en iOS7
(6)
Tengo un UIButton
dentro de un controlador de vista que está incrustado en un UIPageViewController
. El controlador de vista de página está en modo de desplazamiento (Así que no hay gestos). Cuando toco el botón, se llamará al método de acción pero no hay cambios de estado visibles (el estado Resaltado) está sucediendo para el botón. Eso significa que el botón parece intacto. Observado sólo en iOS7. Cualquier trabajo alrededor de esto?
Caso 1: en Normal ViewController el comportamiento del botón con y sin toque
Caso 2: en uno de los controles de PageViewController, el comportamiento del botón con y sin toque
El mismo problema, me enfrentaba con el UITableViewController
. No estoy seguro de que funcione con UIPageViewController
, pero espero que ayude.
self.PageView.delaysContentTouches = NO;
En ViewController:
for (id obj in self.View.subviews)
{
if ([NSStringFromClass([obj class]) isEqualToString:@"UITableViewCellScrollView"])
{
UIScrollView *scroll = (UIScrollView *) obj;
scroll.delaysContentTouches = NO;
break;
}
}
Esto suele suceder cuando pones un botón en un UIScrollView. UIScrollView tiene una propiedad llamada "dalaysContentTouches" que por defecto es SÍ. Si es SÍ, entonces se retrasará la pulsación en el botón (para dar tiempo a verificar si se trata de un gesto de desplazamiento), por lo que no verá que ocurra lo más destacado. Sin embargo, si lo tocas, se registrará al presionar un botón, sin que nunca se resalte.
No estoy seguro de cuál es exactamente tu configuración, pero parece un problema similar. Verifique los gestos de reconocimiento involucrados en su interfaz de usuario y verifique los valores de "delaysTouchesBegan" y "delaysTouchesEnded".
** editado después de la experimentación **
Acabo de probar esto en iOS 7.0 y parece que hizo el truco.
-(void)viewDidAppear:(BOOL)animated {
NSArray *subviews = self.pageViewController.view.subviews;
NSArray *viewHierarchy = [@[self.pageViewController.view] arrayByAddingObjectsFromArray:subviews];
int i = 0;
for (UIView *viewToCheck in viewHierarchy) {
for (UIGestureRecognizer *gestureRecognizer in viewToCheck.gestureRecognizers) {
NSLog(@"%d gestureRecognizer: %@", i++, gestureRecognizer);
gestureRecognizer.delaysTouchesBegan = NO;
}
}
}
Me sale esta salida
0 gestureRecognizer: <UIScrollViewDelayedTouchesBeganGestureRecognizer: 0x8e9b510; state = Possible; delaysTouchesBegan = YES; view = <_UIQueuingScrollView 0x9b7f800>; target= <(action=delayed:, target=<_UIQueuingScrollView 0x9b7f800>)>>
1 gestureRecognizer: <UIScrollViewPanGestureRecognizer: 0x8e9ba10; state = Possible; delaysTouchesEnded = NO; view = <_UIQueuingScrollView 0x9b7f800>; target= <(action=handlePan:, target=<_UIQueuingScrollView 0x9b7f800>)>; must-fail = {
<UIScrollViewPagingSwipeGestureRecognizer: 0x8e9bec0; state = Possible; view = <_UIQueuingScrollView 0x9b7f800>; target= <(action=_handleSwipe:, target=<_UIQueuingScrollView 0x9b7f800>)>>
}>
2 gestureRecognizer: <UIScrollViewPagingSwipeGestureRecognizer: 0x8e9bec0; state = Possible; view = <_UIQueuingScrollView 0x9b7f800>; target= <(action=_handleSwipe:, target=<_UIQueuingScrollView 0x9b7f800>)>; must-fail-for = {
<UIScrollViewPanGestureRecognizer: 0x8e9ba10; state = Possible; delaysTouchesEnded = NO; view = <_UIQueuingScrollView 0x9b7f800>; target= <(action=handlePan:, target=<_UIQueuingScrollView 0x9b7f800>)>>
}>
que revela un UIScrollViewDelayedTouchesBeganGestureRecognizer , que parece ser un reconocedor personalizado para el PageController diseñado para hacer exactamente eso a tu botón ...
¡Pero! Establezca su propiedad delaysTouchesBegan en NO , y el resalte del botón aparecerá inmediatamente al presionar. Espero que eso funcione para ti también.
Intente establecer el estado del botón a resaltado usando el código en su método de IBAction
asociado con el botón.
Button.higlighted = YES;
o puede usar el estado seleccionado cuando se hace clic en el botón en su método de acción
[button setSelected:YES];
No sé si la gente todavía se encuentra con este post, pero lo hice, y pasé tantas horas tratando de encontrar una solución, y finalmente lo hice, así que para las personas que tienen el mismo problema y están trabajando en Swift, esto funcionó. para mi:
Swift 3.1:
override func viewDidLoad() {
super.viewDidLoad()
let views = view.subviews
for view in views {
if let scrollView = view as? UIScrollView {
scrollView.delaysContentTouches = false
}
}
}
UIColor *textColorHighlighted=[UIColor blackColor] ;
[_button setTitleColor:textColorHighlighted forState:UIControlStateHighlighted];
revise los estados
UIButton
definidos enxib
ostoryboard
(pero como dijo que solo está en iOS7, no debería ser un problema)Compruebe qué estado tiene su botón después de hacer clic en su método de acción
intente establecer el estado de su botón recomendado en el método IBAction
yourButton.higlighted = YES; //or yourButton.selected = YES; setting selected state