在iOS 7中去除UIToolbar顶部的细线

29
在iOS 7中,苹果更改了UIToolbar的显示方式,使其在顶部显示1像素的细线。在某些情况下,这会造成视觉上的干扰,并且似乎没有任何公共API可以删除它。
设置shadowImage无效。
我正在寻找一种相对清晰的方法来删除细线,并保持普通的背景模糊。
10个回答

84

啊,好主意。 我也注意到,阴影图像在导航栏下面。 - Thyraz
.barStyle = -1结合使用可实现完全不可见的工具栏(IAS HIG 不确定)。 - user246672

5
发际线边界是工具栏的UIImageView子视图,您可以像这样隐藏它:
        for (UIView *subView in [self.toolbar subviews]) {
            if ([subView isKindOfClass:[UIImageView class]]) {
                // Hide the hairline border
                subView.hidden = YES;
            }
        }

2
做出这样的内部实现细节的假设总是一个坏主意。苹果公司随时可能更改实现方式。 - Greg Brown

5
该行是它的shadowImage。 可以通过应用空UIImage来简单地删除它。 根据文档,您还需要设置自定义背景图像:
- (void)viewDidLoad {
  [self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc]init] forBarMetrics:UIBarMetricsDefault];
  self.navigationController.navigationBar.shadowImage = [[UIImage alloc ]init];
}

请注意:如果您设置了自己的图片,则透明度不会起作用。

我想我应该澄清一下我的问题。我需要去掉发际线,但保留模糊效果(因此不能设置背景图像)。 - fzwo
1
这在iOS 6中曾经有效,但在iOS 7中,将阴影图像设置为透明图像将不起作用 - 在绘制阴影的地方会有一个非常微弱的亮标。 - tinrocket

4
使用故事板时,
self.clipsToBounds = true

可以在运行时属性中为工具栏进行设置。这将隐藏细线。iOS 7和8已经验证。


2

在Storyboard中可以很容易地解决这个问题:

选择作为UIBarButtonItem容器添加的视图,设置它的“剪切子视图”并运行应用程序。

enter image description here


1

虽然不完全符合您的要求,但这个答案肯定会对某些人有所帮助。

如果您想要改变UINavigationBar或UIToolbar底部边框(阴影)的颜色而不是隐藏它,您应该将背景图像和阴影图像设置为您的工具栏。

更改UINavigationBar的底部边框(阴影)

[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"yourImageName"] forBarMetrics:UIBarMetricsDefault]; [self.navigationController.navigationBar setShadowImage:[UIImage imageNamed:@"yourImageName]];

更改UIToolbar的底部边框(阴影)

[yourToolBar setBackgroundImage:[UIImage imageNamed:@"yourImageName"] forToolbarPosition:UIBarPositionBottom barMetrics:UIBarMetricsDefault];

[yourToolBar setShadowImage:[UIImage imageNamed:@"yourImageName"] forToolbarPosition:UIBarPositionBottom];


1
这个解决方案对我很有用... 在iOS 7上尝试过。
[self.navigationController.navigationBar setShadowImage:[UIImage new]];

1

虽然有点hacky,但通过子类化 UITabBar 并覆盖 - (void)addSubview: 方法,我们可以完全防止发际线分隔符添加到视图层次结构中:

- (void)addSubview:(UIView *)view {
    if ([view isKindOfClass:[UIImageView class]] && view.bounds.size.height < 2.0f) {
        return;
    }
    [super addSubview:view]; 
}

这样我们既可以得到模糊的选项卡栏,又可以移除细线分隔符。它还确保 UITabBar 不会将视图剪裁到边界,这对于大型中心按钮或其他 UI 组件的效果非常重要。

0
如果您需要隐藏发际线并显示阴影剪辑,Tobounds无法帮助。
请使用:
TOOLBAR.subviews
      .filter { $0 is UIImageView }
      .forEach { $0.hidden = true }

或者:

for case let imageView is UIImageView in TOOLBAR.subviews {
    imageView.hidden = true 
}

0

在我的情况下,我无法通过Storyboard让它正常工作。最终,我使用外观代理来消除所有工具栏阴影:

[[UIToolbar appearance] setClipsToBounds:YES];


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接