Domanda

Sto aggiungendo un'immagine di sfondo personalizzata al mio UINavigationBar sovrascrivendo drawRect tramite una categoria.

- ( void )drawRect:( CGRect )rect{
    [[UIImage imageNamed:@"navbar.png"] drawInRect:CGRectMake( 0, self.frame.size.height-44, self.frame.size.width, 44 )];
}

Questa soluzione sembra funzionare correttamente, fino a quando non si tenta di utilizzare la proprietà navigationitem.prompt. Invece di fare un'animazione fluida nel presentare il prompt, lo fa bruscamente.

Ci sono suggerimenti su come rimediare? O un modo alternativo di impostare un'immagine di sfondo.

PS. Sto cercando di evitare di aggiungere un'immagine di sfondo come sottoview a causa del modo in cui le cose si riorganizzano quando le viste spingono / pop. E odio mandare SubToBack nella vista di ogni vistaDidAppear.

TIA!

EDIT: ho anche provato il metodo swizzling, che funzionerebbe bene se potessi semplicemente allungare la mia immagine, ma poiché l'immagine non è estensibile, devo capire come attingere all'animazione che sembra fare un turno invece di un tratto.

EDIT: vedi la mia risposta caotica di seguito

È stato utile?

Soluzione

Così tanto "hacky", ma questo è il più vicino che riesco a farlo per fare quello che voglio ...

Fondamentalmente quando il metodo sfrigola, semplicemente lasciare che l'immagine si allunghi non funzionava bene per me perché avevo anche gli angoli arrotondati. Quindi invece ho trasformato gli angoli in un img trasparente separato e l'ho aggiunto come sottoview in modo che non vengano influenzati dall'animazione di stiramento.

Quindi la mia categoria ora appare così ..

#import "UINavigationBar+custom.h"

#define cornersTag 1

@implementation UINavigationBar (UINavigationBarCategory)

-(void)setCornersIfNeeded{
 UIImageView *corners = (UIImageView*)[self viewWithTag:cornersTag];
 if(!corners){
  UIImage *img = [[UIImage imageNamed:@"navbar_corners.png"] stretchableImageWithLeftCapWidth:10 topCapHeight:0];
  corners = [[[UIImageView alloc] initWithImage:img] autorelease];
  corners.frame = CGRectMake(0, 0, self.frame.size.width, img.size.height);
  corners.tag = cornersTag;
  [self addSubview:corners];
 }
}

- (void)customDrawRect:( CGRect )rect{
 [self customDrawRect:rect];
 [[UIImage imageNamed:@"navbar.png"] drawInRect:rect]; 
 [self setCornersIfNeeded];
}

@end

per ulteriori informazioni sul metodo frizzante ... http://www.cocoadev.com/index .pl? MethodSwizzling e Metodo Swizzle sul dispositivo iPhone

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top