【问题标题】:UINavigationBar with two rounded corners带有两个圆角的 UINavigationBar
【发布时间】:2012-04-05 16:21:31
【问题描述】:

我看过这个答案

https://stackoverflow.com/a/9243472/563381

虽然在导航栏的图层上设置蒙版后它的视觉效果很好,但它不再响应触摸...因此无法单击栏上显示的后退按钮。有什么解决方案可以让触摸通过 CALAyer?我不认为 CALayer 会阻止触摸或面具会阻止触摸。

【问题讨论】:

    标签: iphone ipad uikit uinavigationbar calayer


    【解决方案1】:

    好吧,我真的不知道为什么 CALayer 会阻止触摸,这对我来说听起来很奇怪......

    我将 UINavigationBar 转角的方式包括将 2 个 UIImageView(10x10 像素)放在角落中,并向它们添加 2 个图像。这些图像用作遮罩,不会阻挡触摸。如果您使用抗锯齿来绘制图像,则外观非常完美。

    【讨论】:

    • 我觉得很奇怪,设置图层蒙版也会对触摸产生任何影响。您是否在drawrect中将其作为自定义导航栏?还是您只是将它们作为子视图添加到导航栏?
    • 两个 UIImageViews 在我的 NIB 文件的顶部(前面)。所以它们没有连接到我的 UINavigationBar,而是“在”它上面。
    • 我将它们添加为子视图,它工作正常。唯一的问题是它有两个必须将颜色与导航栏完全匹配的png,这被证明是困难的。给你投票,但它不是我现在正在寻找的答案。我真的很想弄清楚为什么面具不能正常工作。为了让事情变得更奇怪,我刚刚开始了一个全新的项目并使用了相同的屏蔽代码并且它没有阻止触摸......我的主项目中没有任何其他导航栏更改,面具是第一个也是唯一的......
    • "两个必须与导航栏颜色完全匹配的 png" -> 创建一个具有透明度的 png:圆形部分应使用从 1 到 0 的 alpha 进行缩放。创建一个角后符合您的想法,您可以将其旋转 90 度并再次使用它,它适用于任何项目中的任何 UINavigationBar。
    • 是的,我刚刚得出这个结论,哈哈。只需要黑色圆形部分。我想如果我创建一个将图像添加到绘图视图的类别,它也不会那么混乱。
    【解决方案2】:

    您应该尝试使用此代码:

    self.navigationController.navigationBar.translucent = YES;

    这将打开您的后退按钮。您可以看到您的按钮,但它位于另一层。这就是为什么它不起作用的原因..

    更新:

    使用这行代码进行测试。这对你来说就像一个魅力。

    //Style UINavigationBar
    UIView *background = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 44)];
    background.backgroundColor = [UIColor blackColor];
    [self.view addSubview:background];
    self.navigationController.navigationBar.tintColor = [UIColor cyanColor];
    self.navigationController.navigationBar.translucent = YES;
    CALayer *capa = [self.navigationController navigationBar].layer;
    [capa setShadowColor: [[UIColor blackColor] CGColor]];
    [capa setShadowOpacity:0.85f];
    [capa setShadowOffset: CGSizeMake(0.0f, 1.5f)];
    [capa setShadowRadius:2.0f];  
    [capa setShouldRasterize:YES];
    
    //Round
    CGRect bounds = capa.bounds;
    bounds.size.height += 10.0f;    //I'm reserving enough room for the shadow
    UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:bounds 
                                                   byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight)
                                                         cornerRadii:CGSizeMake(10.0, 10.0)];
    
    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    maskLayer.frame = bounds;
    maskLayer.path = maskPath.CGPath;
    
    [capa addSublayer:maskLayer];
    capa.mask = maskLayer;
    
    //Back Btn
    UIButton *btnback = [UIButton buttonWithType:UIButtonTypeCustom];
    [btnback setFrame:CGRectMake(0, 0, 54, 29)];
    [btnback setBackgroundImage:[UIImage imageNamed:@"back.png"] forState:UIControlStateNormal];
    UILabel * btnlabel =  [[UILabel alloc]initWithFrame:CGRectMake(15, 0, 40, 23)];
    btnlabel.backgroundColor = [UIColor clearColor];
    btnlabel.textColor = [UIColor whiteColor];
    btnlabel.font = [UIFont boldSystemFontOfSize:13];
    btnlabel.text = @"back";
    [btnback addSubview:btnlabel];
    [btnback addTarget:self action:@selector(backHome:) forControlEvents:UIControlEventTouchUpInside];
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:btnback];
    

    【讨论】:

      猜你喜欢
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 2022-01-12
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多