эффект тени для UINavigationbar, как GameCenter - PullRequest
6 голосов
/ 01 декабря 2010

Я хочу добавить эффект тени для UINavigationbar, как GameCenter.

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

Какова лучшая практика в этом деле ??

Ответы [ 3 ]

5 голосов
/ 01 декабря 2010

Вы можете создать подкласс UINavigationController, а затем иметь теневой слой для каждой навигации или, если ваша панель всегда видна, просто добавьте тень в UIWindow (только один для всего приложения), а затем сделайте его передним видом каждый раз, когда добавляете подпредставление .

CGColorRef darkColor = [[UIColor blackColor] colorWithAlphaComponent:.5f].CGColor;
CGColorRef lightColor = [UIColor clearColor].CGColor;

CAGradientLayer *newShadow = [[[CAGradientLayer alloc] init] autorelease];
newShadow.frame = CGRectMake(0, self.navigationBar.frame.size.height, self.navigationBar.frame.size.width, 10);
newShadow.colors = [NSArray arrayWithObjects:(id)darkColor, (id)lightColor, nil];

[self.navigationBar.layer addSublayer:newShadow];

Если вы выберете последний случай, переопределите didAddSubview, чтобы сделать слой самым передним:

CALayer *superlayer = self.shadowLayer.superlayer;
[self.shadowLayer removeFromSuperlayer];
[superlayer addSublayer:self.shadowLayer];

Надеюсь, это поможет.

2 голосов
/ 12 марта 2011

Это легко сделать с помощью пользовательского подкласса UINavigationController.Ключом является перезапись -viewWillAppear: и добавление подслоя в слой представления UINavigationController:

- (void)viewWillAppear:(BOOL)animated
{
    CGColorRef darkColor = [[UIColor blackColor] colorWithAlphaComponent:.5f].CGColor;
    CGColorRef lightColor = [UIColor clearColor].CGColor;

    CGFloat navigationBarBottom;
    navigationBarBottom = self.navigationBar.frame.origin.y + self.navigationBar.frame.size.height;

    CAGradientLayer *newShadow = [[[CAGradientLayer alloc] init] autorelease];
    newShadow.frame = CGRectMake(0,navigationBarBottom, self.view.frame.size.width, 10);
    newShadow.colors = [NSArray arrayWithObjects:(id)darkColor, (id)lightColor, nil];

    [self.view.layer addSublayer:newShadow];
    [super viewWillAppear:animated];
}

navigationBarBottom учитывает как UINavigationBar, так и строку состояния.Кредит на параметры градиентного слоя переходит к Марсио.

1 голос
/ 01 октября 2012

Рисование CAGradientLayer дает очень равномерную, но - , на мой взгляд - довольно неестественную тень.

Вот альтернативный подход, основанный на ответе на вопрос UIView с тенью .

Он использует различные свойства тени CALayer, чтобы придать эффект тени:

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    self.navigationController.navigationBar.layer.shadowColor = [[UIColor blackColor] CGColor];
    self.navigationController.navigationBar.layer.shadowOffset = CGSizeMake(0.0f,0.0f);
    self.navigationController.navigationBar.layer.shadowOpacity = 1.0f;
    self.navigationController.navigationBar.layer.shadowRadius = 4.0f;
}

Тот же метод работает с tabBarController 's tabBar;

self.tabBarController.tabBar.layer.shadowColor = [[UIColor blackColor] CGColor];
self.tabBarController.tabBar.layer.shadowOffset = CGSizeMake(0.0f,0.0f);
self.tabBarController.tabBar.layer.shadowOpacity = 1.0f;
self.tabBarController.tabBar.layer.shadowRadius = 4.0f;
...