1

我尝试在 iOS7 上通过 drawRect 绘制自定义 UINavigationBar。随着导航栏和状态栏的变化,我的抽奖开始于 y-origin 20.0,而不是状态栏后面的 0.0。我检查了 wwdc 视频,但我只找到了没有自定义绘图的图像示例。有任何想法吗?我需要在我的子类中设置一些参数吗?

  1. 基于“Master-Detail Application”创建一个新项目
  2. 为 UINavigationBar 创建一个子类
  3. 将 Main.storyboard 中的 UINavigationBar 更改为自定义类
  4. 关闭半透明 [self setTranslucent:NO];
  5. 向 UINavigationBar 的子类添加一个真正简单的 drawRect

我做了一个简单的测试:

CGColorSpaceRef colorSpace  = CGColorSpaceCreateDeviceRGB();
UIBezierPath* maskPath = [UIBezierPath bezierPathWithRect: CGRectMake(0, 0, 320, 64)];

[maskPath closePath];
[[UIColor greenColor] setFill];
[maskPath fill];

CGColorSpaceRelease(colorSpace); 

绿色的 NavigationBar 从 Statusbar 开始,如何从 Statusbar 后面开始绘制?

当前解决方案:

@Redwarp 以一种方式发布,我还制作了一个简单的版本进行测试:

CustomBGView *testView = [[CustomBGView alloc] initWithFrame:CGRectMake(0, 0, 320, 64)];

RetinaAwareUIGraphicsBeginImageContext(testView.frame.size);

CGContextRef context = UIGraphicsGetCurrentContext();
[testView.layer renderInContext:context];

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

[self setBackgroundImage:image forBarPosition:UIBarPositionTop barMetrics:UIBarMetricsDefault];

在自定义 UIView 中,您可以随心所欲地进行绘制,并且您的自定义视图也会出现在状态栏的后面。

4

1 回答 1

4

我找到了一个有点奇怪的解决方案:我将 UINavigationBar 子类化,并在 onLayoutSubviews 中创建我想要创建的背景,并将其设置为背景图像。所以我做了相当于drawRect的操作,但是在我设置为背景的UIImage中。然后,在 xib 或故事板中,我选择我的子类作为导航栏的类型。

开始 :

@implementation MyNavigationBar

- (void)layoutSubviews {
    [super layoutSubviews];

    CGPoint origin = [self.superview convertPoint:self.frame.origin toView:nil];
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(self.bounds.size.width, self.bounds.size.height + origin.y), NO, 0.0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClipToRect(context, CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height + origin.y));
    [self.baseImage drawInRect:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)];
    UIImage *backgroundImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    [self setBackgroundImage:backgroundImage forBarMetrics:UIBarMetricsDefault];
    // If you don't want the bar shadow, set the shadow image as null
    [self setShadowImage:[UIImage new]];
}

并且当你不想改变图像时,你调用[navigationBar needsLayout],它会再次调用layoutSubviews

编辑:诀窍是获取导航栏的来源。如果有状态栏,则原点为 y 20。如果没有状态栏,则原点为 0。因此,您将 origin.y 添加到绘图中的图像的高度,您将获得一个不错的结果。

于 2013-10-11T10:00:55.107 回答