Фоновое изображение панели UINavigationBar через drawRect - проблема с анимацией запроса
-
06-07-2019 - |
Вопрос
Я добавляю пользовательское фоновое изображение в свою панель 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.Я пытаюсь избежать простого добавления фонового изображения в качестве подвида из-за того, как все перестраивается при просмотре push / pop.И я бы не хотел отправлять SUBVIEWTOBACK в viewDidAppear каждого представления.
ТИА!
Редактировать:Я также попробовал метод swizzling , который работал бы нормально, если бы я мог просто позволить своему изображению растягиваться, но поскольку изображение не растягивается, мне нужно выяснить, как использовать анимацию, которая выполняет сдвиг вместо растяжения.
Редактировать:смотрите мой хакерский ответ ниже
Решение
Очень "халтурно", но это самое близкое, что я могу заставить его делать то, что я хочу...
В принципе, при использовании метода swizzling простое растягивание изображения у меня плохо получалось, потому что у меня также были закругленные углы.Поэтому вместо этого я сделал углы отдельным прозрачным изображением и добавил его в качестве подвида, чтобы на них не повлияла анимация растяжения.
Итак, моя категория теперь выглядит следующим образом..
#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
подробнее о методе обжаривания... http://www.cocoadev.com/index.pl?MethodSwizzling и Метод Swizzle на устройстве iPhone