как я могу добавить прикрепленные тени к uinavigationbar и uitoolbar

Я работаю над приложением, которое использует настраиваемое изображение для UINavigationBar и UIToolbar, и это нормально, но им также нужна тень под панелью навигации и над панелью инструментов, которая всегда будет располагаться над всеми другими контроллерами представления. Я не могу просто сделать фоновые изображения, включающие тени, так как это не будет работать с моими таблицами. Мне также нужно, чтобы тени анимировались, когда я устанавливаю панель навигации и панель инструментов на скрытые (анимированные).

Я просмотрел Stack Overflow и другие источники в сети и проработал предлагаемые решения, но я не могу успешно создать подкласс UINavigationBar, UIToolbar или даже UINavigationController, чтобы получить результаты, которые мне нужны.

Буду признателен за любую помощь, которая может быть предложена. Спасибо :)


person scottsanders    schedule 08.04.2011    source источник


Ответы (3)


В конце концов, я решил просто использовать фоновые изображения png с тенями и применить их с подклассом для UINavigationBar и UIToolbar, который реализовал метод drawRect (для фонового изображения) и метод sizeThatFits для изменения размера панели навигации. Вот конечный продукт (кнопка скрывает полоски):

Вот методы, которые я реализовал в каждом подклассе:

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


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

Обратите внимание, что в IB я также сделал полосы черными полупрозрачными, чтобы контент перетекал под ними.

person scottsanders    schedule 09.04.2011

Это можно сделать относительно легко, если вы не делаете ничего особенного со своей иерархией представлений. Добавьте следующие строки кода в метод вашего приложения: didFinishLaunchingWithOptions.

dispatch_async(dispatch_get_main_queue(), ^{
    UIWindow* mainWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:0];
    UIView* mainView = [[mainWindow subviews] objectAtIndex:0];
    UIImageView* shadowImageView = [[UIImageView alloc] initWithImage:kImgNavbarShadowResizeable];
    shadowImageView.frame = CGRectMake(0, 64, 320, shadowImageView.frame.size.width);
    [mainView insertSubview:shadowImageView atIndex:1];
});

ShadowImageView - это изображение, которое вы хотите использовать в качестве тени.

person Aron Lindberg    schedule 25.07.2012

Прочтите запись в блоге Мэтта Галлахера. Он охватывает (часть) того, чем вы хотите заниматься. Помимо этого, вы можете попробовать добавить «теневой вид» над вашим контроллером навигации, который вы можете анимировать по своему усмотрению.

person ryyst    schedule 08.04.2011
comment
Я видел сообщение Мэтта и пытался его использовать, но метод Layoutsubviews UINavigationBar и UIToolbar не позволяет мне размещать слой за пределами представления. Я изменил этот пример, чтобы добавить слои в супервизор, который сработал (сделал это до публикации этого вопроса), но тени не были прикреплены, и поэтому скрыть анимацию тени просто плавали там над содержимым. - person scottsanders; 09.04.2011