Подтвердить что ты не робот

Как создать тень UINavigationBar

Хотелось бы знать, создать тень для 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

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

4b9b3361

Ответ 1

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

self.layer.masksToBounds = NO;

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

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

self.layer.shouldRasterize = YES;

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

Ответ 2

Если вы применяете тень к 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

Ответ 3

Так как iOS 6.0, UINavigationBar имеет свойство shadowImage:

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

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

Ответ 4

Я привязываю код рисования тени к функции, чтобы поддерживать 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;
}