2012-04-27 13 views
6

Ho creato un'applicazione con un menu laterale come Facebook. Ho un controller di visualizzazione di root che aggiunge una vista su se stesso, quindi quando l'utente preme il pulsante 'Menu' farà scorrere la vista sopra in modo da poter vedere il menu.UINavBar sembra avere uno strato invisibile su altri pulsanti

Il mio problema è che quando la vista viene caricata per la prima volta, sembra che UINavBar sia circa 20 pixel o più basso di quanto dovrebbe essere. (L'immagine in basso sembra un po 'fuori centrato, perché è un flip orizzontale modale)

enter image description here

E quindi automaticamente si regola e si muove su poco meno che la barra di stato quando la transizione modale è completa.

enter image description here

Ecco uno screenshot di ciò che accade quando si preme il pulsante "Menu". Scivola la vista dall'alto verso destra

enter image description here

Come si può vedere nelle immagini sopra ho la freccia sinistra e freccia destra cornice di sfondo impostato su rosso in modo che posso vedere dove la zona cliccabile/tappable è. Ho un'altra immagine che ho disegnato su una linea blu che mostra se clicco sulla linea blu o sopra, quindi non innescherà la freccia destra. Se clicco nella stessa area generale sul lato sinistro, il pulsante del menu si innescherà. Sono in grado di riprodurlo sia sul simulatore che su un dispositivo mobile (quindi non ho grosse dita sul pulsante).

enter image description here

Mi sembra che da quando la barra di navigazione sta caricando inferiore a quello che si suppone che l'iPhone pensa che sia ancora in quella posizione in modo che quando si fa clic all'interno della cornice UIButton ancora sta innescando il Menu e non attivando i selettori freccia. Se tocco DIRETTAMENTE nel mezzo delle frecce, fa scattare i selettori delle frecce ma appena un pochino fuori dall'immagine, non attiverà il selettore freccia.

Ecco il mio 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 registri

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]; 

Se sposto il headerView più in basso, mi consentirà di selezionare un punto qualsiasi nell'area rossa e di far scattare il selettore a freccia. Tuttavia, voglio che corrisponda al calendario delle mele e che sia appena sotto la barra di navigazione.

Qualcuno sa perché la barra di navigazione blocca la porzione superiore di headerView da toccare? Per essere chiari, la parte dell'intestazioneView che viene bloccata proviene dalla parte inferiore della linea blu e verso l'alto. Lo UIButton con lo sfondo rosso ha un'azione legata al fotogramma, quindi dovrebbe attivare l'evento, tuttavia sembra che la barra di navigazione blocca metà dello UIButton dalla ricezione dei tocchi.

+0

È possibile registrare i limiti della vista del contenuto e il frame del controller nav dal primo frammento di codice che hai postato? Utilizzare NSStringFromCGRect per ottenere una stringa standard che è possibile stampare sulla console. – Sam

+0

@Sam Ho modificato l'OP per includere i registri associati – Bot

risposta

1

Questo comportamento è dovuto al fatto che UIWindow non sta moltiplicando i tocchi che coincidono con il riquadro della barra di navigazione. L'unico modo per ignorare questo comportamento è sottoclasse UIWindow e sovrascrive il metodo hitTest :. Ciò ti consentirà di rilevare tocchi in quest'area e di inoltrarli ai risponditori appropriati.

Here è un progetto di esempio che mostra una sottoclasse UIWindow personalizzata che risponderà al tocco in qualsiasi punto dello schermo.

+0

puoi dare un esempio di come questo si applicherebbe a me e come lo userei per le mie esigenze? – Bot

Problemi correlati