Добавление тени к UINavigationControllerer

#iphone #objective-c #uinavigationcontroller #shadow

#iPhone #objective-c #uinavigationcontroller #тень

Вопрос:

Я пытаюсь добавить тень к UINavigationController. Мой have основан на NavController, и я пытаюсь добавить тень, как в game centers. Пока у меня это есть. Это работает на панели UINavigationBar, но я пытаюсь заставить ее работать во всем приложении.

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

CAGradientLayer *newShadow = [[[CAGradientLayer alloc] init] autorelease];
newShadow.frame = CGRectMake(0, 44, 320, 10);
newShadow.colors = [NSArray arrayWithObjects:(id)darkColor, (id)lightColor, nil];

CALayer *superlayer = self.newShadow.superlayer;
[self.newShadow removeFromSuperlayer];
[superlayer addSublayer:self.newShadow];
[self.navigationBar.layer addSublayer:superlayer];
  

Это работает непосредственно на UINavigationBar, но при применении к проекту NavigationController происходит сбой. Он создает, но не добавляет тень. Есть идеи?

Редактировать:

Я пробовал разные подходы к этому. Я успешно создал градиент с помощью формы.

 @implementation UINavigationBar (UINavigationBarCategory)
- (void)drawRect:(CGRect)rect {
UIImage *backgroundImage;
backgroundImage = [UIImage imageNamed:@"nav.png"];
[backgroundImage drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];


CGContextRef context = UIGraphicsGetCurrentContext();
CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB();
size_t num_locations = 2;
CGFloat locations[2] = { 1.0, 0.0 };
CGFloat components[8] = { 1.0, 1.0, 1.0, 1.0,    0.0, 0.0, 0.0, 0.5 };

CGGradientRef myGradient = CGGradientCreateWithColorComponents(myColorspace, components, locations, num_locations);

CGPoint myStartPoint, myEndPoint;
myStartPoint.x = 0.0;
myStartPoint.y = 0.0;
myEndPoint.x = 0.0;
myEndPoint.y = 54.0;
CGContextDrawLinearGradient (context, myGradient, myStartPoint, myEndPoint, 1);
}
  

Я не могу получить градиент под UINavigationBar и его наложение на изображение. Кажется, я не могу заставить это работать. Что я пытаюсь сделать, так это добавить ту же тень, что и в Game Center. Я попробовал несколько разных способов. Все, что мне нужно сделать здесь, это расположить это под UINavigationBar, чтобы изображение было сверху, и чтобы небольшая часть тени лежала сверху на UITableView, чтобы при прокрутке вверх она была над UITableView. Если вы запустите Game Center, вы увидите именно то, о чем я говорю.

Комментарии:

1. Находится ли это в UINavigationController подклассе?

2. Я пробовал подкласс, но он тоже не сработал. И нет, это в UIViewController в viewDidLoadAnimated:

Ответ №1:

Я считаю, что вам следует добавить ее в

    UINavigationController.view.layer
  

Как UINavigationController, он не является дочерним элементом UIView.

если вы уже сделали это, другой способ последовательно изменять панель навигации во всем приложении — использовать UINavigationBarCategory:

вы должны выполнить это в конце вашего делегирования — после @end

 @implementation UINavigationBar (UINavigationBarCategory)
- (void)drawRect:(CGRect)rect {
    //implement your design
}
@end
  

Редактировать

по этой ссылке вы можете найти основную информацию о том, как нарисовать полосу: Руководство по рисованию графики для iPhone с использованием Quartz 2D

и здесь вы можете найти, как добавить тень:добавление тени с помощью quartz 2d

Удачи

Комментарии:

1. Я попробовал UINavigationController.view.layer , но это не сработало, но я подумал, что этого не будет. Размещение ее в прямоугольнике рисования не сработало. Мне не на что установить подуровень. Я пытался [self addSublayer:newShadow] , но не понимаю, как это применить. Все остальное имеет значение

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

3. Спасибо, я никогда не играл с Quartz, так что это мой первый раз. Большое спасибо

4. добавлены ссылки. первый очень прост. поиграйте с этим, и вы увидите, что это не такая уж большая проблема

5. Я использовал то, что вы сказали. Я обновил свой вопрос. Смотрите выше ^

Ответ №2:

Вы могли бы создать подкласс UIView и использовать свой существующий код для отрисовки тени путем переопределения -drawRect: . Затем, где бы это ни было необходимо, создайте его и добавьте в представление контроллера навигации.

Рассмотрим этот пример

 CGFloat screenWidth = [UIScreen mainScreen].applicationFrame.size.width;
ShadowView *shadowView = [[ShadowView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, screenWidth, 20.0f)];
[self.navigationController.view insertSubview:shadowView atIndex:0];
  

Добавляя ее в представление NavigationController с индексом 0, вы эффективно накладываете ее поверх всего, что отображает контроллер представления. Вы могли бы дополнительно улучшить это, проверив масштаб главного экрана, чтобы соответствующим образом рассчитать высоту теневого изображения, чтобы оно правильно отображалось на всех устройствах, независимо от наличия дисплея retina.