2012-04-27 14 views
6

Creé una aplicación con un menú lateral como facebook. Tengo un controlador de vista raíz que agrega una vista sobre sí mismo, luego cuando el usuario presiona el botón 'Menú', se desliza la vista para que pueda ver el menú.UINavBar parece tener una capa invisible sobre otros botones

Mi problema es que cuando la vista carga por primera vez, parece que el UINavBar es aproximadamente 20 píxeles más o menos de lo que debería ser. (La imagen de abajo se ve un poco centrada fuera porque es un flip horizontal modal)

enter image description here

A continuación, se ajusta automáticamente y se mueve hacia arriba justo debajo de la barra de estado que cuando la transición modal es completa.

enter image description here

Aquí es una captura de pantalla de lo que sucede cuando se presiona el botón "Menú". Se desliza la vista desde arriba a la derecha

enter image description here

Como se puede ver en las imágenes de arriba tengo la flecha izquierda y flecha derecha del fondo del marco establecido en rojo para que pueda ver donde la región puede hacer clic/hacer tapping es. Tengo otra imagen sobre la que dibujé una línea azul que muestra que si hago clic en la línea azul o superior, no activará la flecha derecha. Si hago clic en esa misma área general en el lado izquierdo, se activará el botón de menú. Puedo reproducir esto tanto en el simulador como en un dispositivo móvil (así que no estoy gordo tocando el botón).

enter image description here

Me parece que desde la barra de navegación se está cargando menor de lo que se supone que el iPhone piensa que todavía está en esa posición por lo que al hacer clic en el interior del marco UIButton todavía está provocando el menú y no activando los selectores de flecha. Si toco DIRECTAMENTE en el centro de las flechas, activa los selectores de flechas pero solo un poquito fuera de la imagen, no activará el selector de flechas.

Aquí es mi RootViewController viewDidLoad

AppointmentViewController *appointmentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"AppointmentViewController"]; 
NSLog(@"B: %@",NSStringFromCGRect(appointmentViewController.view.frame)); 
self.navController = [[UINavigationController alloc] initWithRootViewController:appointmentViewController]; 
NSLog(@"B2: %@",NSStringFromCGRect(appointmentViewController.view.frame)); 
NSLog(@"Nav Bounds: %@",NSStringFromCGRect(self.navController.view.frame)); 
NSLog(@"Bounds: %@",NSStringFromCGRect(self.contentView.bounds)); 
self.navController.view.frame = self.contentView.bounds; 
NSLog(@"Nav Bounds2: %@",NSStringFromCGRect(self.navController.view.frame)); 
[self addShadowToMenu]; 
[self.contentView addSubview:self.navController.view]; 

RootViewController Registros

2012-04-30 12:24:44.533 My-App[19929:fb03] B: {{0, 20}, {320, 460}} 
2012-04-30 12:24:44.535 My-App[19929:fb03] B2: {{0, 20}, {320, 460}} 
2012-04-30 12:24:44.535 My-App[19929:fb03] Nav Bounds: {{0, 0}, {320, 480}} 
2012-04-30 12:24:44.535 My-App[19929:fb03] Bounds: {{0, 0}, {320, 460}} 
2012-04-30 12:24:44.535 My-App[19929:fb03] Nav Bounds2: {{0, 0}, {320, 460}} 

AppointmentViewController

self.title = [dataObj.preferences objectForKey:@"appts_name_plural"]; 
self.navigationItem.title = self.title; 
dayView = [[APCalendarDayView alloc] initWithCalendarView:(APCalendarView *)self]; 
APListView = [self.storyboard instantiateViewControllerWithIdentifier:@"AppointmentListView"]; 
APListView.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; 


SideMenuView *myDelegate = [[SideMenuView alloc] init]; 
[self setSideMenuDelegate:myDelegate]; 
//set the delegate's currentViewController property so that we can add a subview to this View. 
[sideMenuDelegate setCurrentViewController:self]; 

UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 
UIBarButtonItem *today = [[UIBarButtonItem alloc] initWithTitle:@"Today" style:UIBarButtonItemStyleBordered target:nil action:@selector(todayPressed)]; 
NSArray *appointmentNavigationItems = [[NSArray alloc] initWithObjects:@"Day",@"List",@"Month", nil]; 
navcontrol = [[UISegmentedControl alloc] initWithItems:appointmentNavigationItems]; 
[navcontrol setSegmentedControlStyle:UISegmentedControlStyleBar]; 
[navcontrol addTarget:self action:@selector(appointmentNavigationClicked:) forControlEvents:UIControlEventValueChanged]; 
[navcontrol setSelectedSegmentIndex:0]; 
UIBarButtonItem *segmentItems = [[UIBarButtonItem alloc] initWithCustomView:navcontrol]; 

NSArray *items = [NSArray arrayWithObjects:today,flexSpace,segmentItems, flexSpace, nil]; 
[appointmentToolbar setItems:items animated:NO]; 
[appointmentToolbar setAutoresizesSubviews:YES]; 


[[self.view superview] addSubview:myDelegate.view]; 
[self setViewSizeOffset:(appointmentToolbar.bounds.size.height)]; 

CalendarDayView

- (void)addSubviewsToHeaderView:(UIView *)headerView 
{ 
    const CGFloat kChangeMonthButtonWidth = 46.0f; 
    const CGFloat kChangeMonthButtonHeight = 44.0f; 
    const CGFloat kMonthLabelWidth = 215.0f; 
    const CGFloat kHeaderVerticalAdjust = 7.f; 

    // Header background gradient 
    UIImageView *backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Kal.bundle/kal_grid_background.png"]]; 
    CGRect imageFrame = headerView.frame; 
    imageFrame.origin = CGPointZero; 
    backgroundView.frame = imageFrame; 
    [headerView addSubview:backgroundView]; 
    [backgroundView setAutoresizesSubviews:YES]; 
    [backgroundView setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; 

    // Create the previous month button on the left side of the view 
    CGRect previousMonthButtonFrame = CGRectMake(self.left, 0, kChangeMonthButtonWidth, kChangeMonthButtonHeight); 
    UIButton *previousMonthButton = [[UIButton alloc] initWithFrame:previousMonthButtonFrame]; 
    [previousMonthButton setBackgroundColor:[UIColor redColor]]; 
    [previousMonthButton setImage:[UIImage imageNamed:@"Kal.bundle/kal_left_arrow.png"] forState:UIControlStateNormal]; 
    previousMonthButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter; 
    previousMonthButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 
    [previousMonthButton addTarget:self action:@selector(showPreviousDay) forControlEvents:UIControlEventTouchUpInside]; 
    //[previousMonthButton setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleLeftMargin]; 
    [headerView addSubview:previousMonthButton]; 

    // Draw the selected month name centered and at the top of the view 
    CGRect monthLabelFrame = CGRectMake((self.frame.size.width/2.0f) - (kMonthLabelWidth/2.0f), kHeaderVerticalAdjust, kMonthLabelWidth, kMonthLabelHeight); 
    headerTitleLabel = [[UILabel alloc] initWithFrame:monthLabelFrame]; 
    headerTitleLabel.backgroundColor = [UIColor clearColor]; 
    headerTitleLabel.font = [UIFont boldSystemFontOfSize:22.f]; 
    headerTitleLabel.textAlignment = UITextAlignmentCenter; 
    headerTitleLabel.textColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"Kal.bundle/kal_header_text_fill.png"]]; 
    headerTitleLabel.shadowColor = [UIColor whiteColor]; 
    headerTitleLabel.shadowOffset = CGSizeMake(0.f, 1.f); 
    //[self setHeaderTitleText:[logic selectedMonthNameAndYear]]; 

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"E, MMM dd, yyyy"]; 
    headerTitleLabel.text = [dateFormatter stringFromDate:dataObj.activeDate]; 
    [headerView addSubview:headerTitleLabel]; 

    // Create the next month button on the right side of the view 
    CGRect nextMonthButtonFrame = CGRectMake(self.frame.size.width - kChangeMonthButtonWidth, 0, kChangeMonthButtonWidth, kChangeMonthButtonHeight); 
    UIButton *nextMonthButton = [[UIButton alloc] initWithFrame:nextMonthButtonFrame]; 
    nextMonthButton.frame = nextMonthButtonFrame; 
    [nextMonthButton setImage:[UIImage imageNamed:@"Kal.bundle/kal_right_arrow.png"] forState:UIControlStateNormal]; 
    [nextMonthButton setBackgroundColor:[UIColor redColor]]; 
    nextMonthButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter; 
    nextMonthButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 
    [nextMonthButton addTarget:self action:@selector(showFollowingDay) forControlEvents:UIControlEventTouchUpInside]; 
    //[nextMonthButton setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; 
    [headerView addSubview:nextMonthButton]; 
} 

UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0.f, 0.f, self.frame.size.width, kHeaderHeight)]; 
    headerView.backgroundColor = [UIColor grayColor]; 
    [self addSubviewsToHeaderView:headerView]; 
    [headerView setAutoresizesSubviews:YES]; 
    [headerView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight]; 
    [self addSubview:headerView]; 
    [self bringSubviewToFront:headerView]; 

Si muevo el headerView hacia abajo, me permitirá seleccionar cualquier lugar en el área roja y hacer que se active el selector de flechas. Sin embargo, quiero que coincida con el calendario de manzanas y que esté justo debajo de la barra de navegación.

¿Alguien sabe por qué la barra de navegación está bloqueando la parte superior de headerView de ser interceptado? Para que quede claro, la parte del headerView que se está bloqueando se encuentra en la parte inferior de la línea azul y hacia arriba. El UIButton con el fondo rojo tiene una acción vinculada al marco, por lo que debería desencadenar el evento; sin embargo, parece que la barra de navegación está bloqueando la mitad del UIButton de los grifos de recepción.

+0

¿Puede registrar los límites de la vista de contenido y el marco del controlador de navegación desde el primer fragmento de código que publicó? Use NSStringFromCGRect para obtener una cadena estándar que puede imprimir en la consola. – Sam

+0

@Sam He editado el OP para incluir los registros enlazados – Bot

Respuesta

1

Este comportamiento se debe al hecho de que UIWindow no está propagando toques que coinciden con el marco de la barra de navegación. La única forma de anular este comportamiento es subclase UIWindow y anular el método hitTest :. Esto le permitirá detectar toques en esta área y enviarlos a los respondedores apropiados.

Here es un proyecto de ejemplo que muestra una subclase de UIWindow personalizada que responderá a toques en cualquier lugar de la pantalla.

+0

¿Puede dar un ejemplo de cómo esto se aplicaría a mí y cómo lo usaría para mis necesidades? – Bot

Cuestiones relacionadas