Добавление тени в UINavigationControllerer - PullRequest
0 голосов
/ 06 апреля 2011

Я пытаюсь добавить тень в UINavigationController.У меня есть NavController, и я пытаюсь добавить тень, как в игровых центрах.У меня есть это до сих пор.Это работает на UINavigationnBar, но я пытаюсь заставить его работать на протяжении всего приложения.

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, вы точно поймете, о чем я говорю.

Ответы [ 2 ]

0 голосов
/ 06 апреля 2011

Вы можете создать подкласс 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, вы фактически накладываете его поверх того, что отображает контроллер представления. Вы можете улучшить это, проверив масштаб основного экрана, чтобы правильно рассчитать высоту теневого вида, чтобы он правильно отображался на всех устройствах, независимо от наличия дисплея сетчатки.

0 голосов
/ 06 апреля 2011

Я полагаю, вы должны добавить его к

   UINavigationController.view.layer

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

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

Вы должны сделать это в конце своего делегата - после @ end

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

EDIT

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

и здесь вы можете найти, как добавить тень: добавить тень с кварцем 2d

Удачи

...