Как создать тень UINavigationBar - PullRequest
37 голосов
/ 09 мая 2011

Хотелось бы знать, создать тень для UINavigationbar.Я попытался создать пользовательский фон панели навигации с тенью, но тень скрывает вид фона.

@implementation UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect {
   UIImage *image = [[UIImage imageNamed:@"titleBar.png"] retain];;
   [image drawInRect:rect];
   [image release];
}

- (CGSize)sizeThatFits:(CGSize)size {
   CGSize newSize = CGSizeMake(320,50);
   return newSize;
}
@end

I also tried on following solution: http://www.travisboudreaux.com/adding-a-drop-shadow-to-a-uinavigationbar: 

@interface UINavigationBar (dropshadow)

-(void) applyDefaultStyle;

@end

@implementation UINavigationBar (dropshadow)

-(void)willMoveToWindow:(UIWindow *)newWindow{
   [self applyDefaultStyle];
}

- (void)applyDefaultStyle {
  // add the drop shadow
  self.layer.shadowColor = [[UIColor blackColor] CGColor];
  self.layer.shadowOffset = CGSizeMake(0.0, 3.0);
  self.layer.shadowOpacity = 0.25;
}
@end

Показывает тень для моей кнопки панели навигации, но нет самой панели навигации.

Окончательное решение: Вот как я создаю тень для UINavigationBar.Большое спасибо за MusiGenesis за указание на недостающую ссылку моего кода:

#import <QuartzCore/QuartzCore.h>

@interface UINavigationBar (CustomImage)

-(void) applyDefaultStyle;

@end

//Override For Custom Navigation Bar
@implementation UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect {
    UIImage *image = [UIImage imageNamed: @"titleBar.png"];
    [image drawInRect:CGRectMake(0, 0, 320, 44)];   
}

-(void)willMoveToWindow:(UIWindow *)newWindow{
    [super willMoveToWindow:newWindow];
    [self applyDefaultStyle];
}

- (void)applyDefaultStyle {
    // add the drop shadow
    self.layer.shadowColor = [[UIColor blackColor] CGColor];
    self.layer.shadowOffset = CGSizeMake(0.0, 3);
    self.layer.shadowOpacity = 0.25;
    self.layer.masksToBounds = NO;
    self.layer.shouldRasterize = YES;
}

@end

** Не забудьте импортировать кварцевое ядро, иначе возникнет ошибка.

Ответы [ 4 ]

44 голосов
/ 06 марта 2012

Если вы примените тень к UINavigationBar, тень будет обрезана ниже углов:

clipped shadow

Именно так ведут себя тени на прямоугольниках.Я обычно создаю путь для тени, который немного шире, чем фактическая навигационная панель, который создает эффект, который больше всего соответствует ожидаемому:

@implementation UINavigationBar (DropShadow)

-(void)willMoveToWindow:(UIWindow *)newWindow {
    [super willMoveToWindow:newWindow];
    self.layer.shadowColor = [UIColor blackColor].CGColor;
    self.layer.shadowOpacity = 1;
    self.layer.shadowOffset = CGSizeMake(0,4);
    CGRect shadowPath = CGRectMake(self.layer.bounds.origin.x - 10, self.layer.bounds.size.height - 6, self.layer.bounds.size.width + 20, 5);
    self.layer.shadowPath = [UIBezierPath bezierPathWithRect:shadowPath].CGPath;
    self.layer.shouldRasterize = YES;
}

better

29 голосов
/ 09 мая 2011

В applyDefaultStyle, попробуйте добавить эту строку:

self.layer.masksToBounds = NO;

Значение по умолчанию для этого свойства YES, что означает, что хотя тень отображается, она не будет отображаться снаружиграницы представления, что фактически означает, что вы его вообще не видите.

Если вы каким-либо образом анимируете это представление, вам также следует добавить следующую строку:

self.layer.shouldRasterize = YES;

... если вы не хотите, чтобы анимация была медленной и прерывистой.

9 голосов
/ 26 марта 2013

Начиная с iOS 6.0, UINavigationBar имеет свойство shadowImage:

@property(nonatomic,retain) UIImage *shadowImage NS_AVAILABLE_IOS(6_0) UI_APPEARANCE_SELECTOR;

, что, конечно, значительно упрощает эту очень распространенную задачу: D

0 голосов
/ 12 ноября 2013

Я вставляю код рисования теней в функцию, чтобы поддерживать чистоту loadView.Вы можете передать объект, на котором хотите нарисовать тень, если хотите, чтобы все ваши тени были единообразными.

- (void)loadView
{
    self.view = [[UIView alloc] init];
    self.view.backgroundColor = [UIColor whiteColor];

    [self drawShadow];
}


- (void)drawShadow
{
    self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
    self.navigationController.navigationBar.layer.shadowOpacity = 0.3;
    self.navigationController.navigationBar.layer.shadowOffset = CGSizeMake(0, 0);
    self.navigationController.navigationBar.layer.shadowRadius = 15;
    self.navigationController.navigationBar.layer.masksToBounds = NO;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...