Как создать тень 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
** Не забудьте импортировать кварцкор или он будет вызывать ошибку.
Ответы
Ответ 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;
}