UINavigationBar фоновое изображение через drawRect - проблема с быстрой анимацией - PullRequest
3 голосов
/ 25 октября 2009

Я добавляю пользовательское фоновое изображение в свой UINavigationBar, переопределяя drawRect через категорию.

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

Это решение работает нормально, пока вы не попытаетесь использовать свойство navigationitem.prompt. Вместо плавной анимации представления приглашения, он делает это внезапно.

Есть какие-нибудь предложения о том, как это исправить? Или альтернативный способ установки фонового изображения.

PS. Я стараюсь избегать просто добавления фонового изображения в качестве подпредставления из-за того, как вещи меняются, когда представления нажимают / выдвигаются. И я не хотел бы отправлять SubviewToBack в viewDidAppear каждого представления.

ТИА!

РЕДАКТИРОВАТЬ: я также попробовал метод Swizzling, который работал бы хорошо, если бы я мог просто растянуть свое изображение, но, поскольку изображение не растягивается, мне нужно выяснить, как использовать анимацию, которая происходит, чтобы сделать сдвиг вместо натяжения.

РЕДАКТИРОВАТЬ: см. Мой хакерский ответ ниже

1 Ответ

0 голосов
/ 25 октября 2009

Так что очень "хакерский", но это самое близкое, что я могу заставить его делать то, что я хочу ...

В основном, когда метод изгибается, просто растягивать изображение не очень хорошо для меня, потому что у меня тоже были закругленные углы. Поэтому вместо этого я сделал углы отдельным прозрачным img и добавил его в качестве подпредставления, чтобы на них не влияла растягивающаяся анимация.

Итак, моя категория теперь выглядит так ...

#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

Подробнее о методе Swizzling ... http://www.cocoadev.com/index.pl?MethodSwizzling и метод Swizzle на устройстве iPhone

...