在 iOS 7 中移除 UIToolbar 细线

Posted

技术标签:

【中文标题】在 iOS 7 中移除 UIToolbar 细线【英文标题】:Remove UIToolbar hairline in iOS 7 【发布时间】:2013-10-01 07:57:52 【问题描述】:

ios 7 中,Apple 已将 UIToolbar 更改为在其顶部显示 1 像素的细线。在某些情况下,这会在视觉上分散注意力,而且似乎没有任何公共 API 可以将其删除。

设置 shadowImage 不起作用。

我正在寻找一种相对干净的方式去除发际线,并保持普通背景模糊。

【问题讨论】:

【参考方案1】:

如果设置 youBar.clipsToBounds = YES,细线消失。

希望对您有所帮助。

[编辑]

对于navigationBar底部细线,https://***.com/a/18180330/2011578这里的解决方案也很好用。

【讨论】:

啊,好主意。我还注意到,阴影图像位于导航栏下方 这应该被选为正确答案。这也适用于我。 ? 结合.barStyle = -1 可以实现完全不可见的工具栏(但是 IAS HIG 不确定) 确实是救命稻草。【参考方案2】:

细线边框是工具栏的一个UIImageView子视图,可以这样隐藏:

        for (UIView *subView in [self.toolbar subviews]) 
            if ([subView isKindOfClass:[UIImageView class]]) 
                // Hide the hairline border
                subView.hidden = YES;
            
        

【讨论】:

像这样对内部实现细节做出假设总是一个坏主意。 Apple 可以随时更改实施。【参考方案3】:

这条线是它的shadowImage。 它可以通过应用一个空的 UIImage 来简单地删除。 根据文档,您还必须设置自定义背景图片

- (void)viewDidLoad 
  [self.navigationController.navigationBar setBackgroundImage:[[UIImage alloc]init] forBarMetrics:UIBarMetricsDefault];
  self.navigationController.navigationBar.shadowImage = [[UIImage alloc ]init];

请注意:如果您设置自己的图像以备不时之需,半透明将不起作用。

【讨论】:

我想我应该澄清我的问题。我需要去除发际线,但保持模糊(所以不设置背景图像)。 这在 iOS 6 中可以使用,但在 iOS 7 中,将阴影图像设置为透明图像将不起作用——阴影被绘制的地方有一个非常微弱、明亮的标记。【参考方案4】:

使用情节提要时,

self.clipsToBounds = true

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

【讨论】:

【参考方案5】:

可以在故事板上轻松解决:

选择添加为 UIBarButtonItem Container 的 View 并设置其“Clip Subviews”并运行应用程序。

【讨论】:

【参考方案6】:

这个解决方案对我有用...在 iOS 7 上试过这个

[self.navigationController.navigationBar setShadowImage:[UIImage new]];

【讨论】:

【参考方案7】:

不完全是你想要的,但这个答案肯定会对某人有所帮助。

如果你想改变 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];

【讨论】:

【参考方案8】:

虽然有点 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 组件等效果很重要。

【讨论】:

【参考方案9】:

在我的情况下,我无法通过 Storyboard 完成这项工作。我最终使用外观代理消除了所有工具栏上的阴影:

[[UIToolbar appearance] setClipsToBounds:YES];

【讨论】:

【参考方案10】:

如果您需要隐藏细线并显示阴影剪辑Tobounds 没有帮助

使用:

TOOLBAR.subviews
      .filter  $0 is UIImageView 
      .forEach  $0.hidden = true 

或:

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

【讨论】:

以上是关于在 iOS 7 中移除 UIToolbar 细线的主要内容,如果未能解决你的问题,请参考以下文章

iOS7 UIToolbar 上缺少阴影(细线)

在 iOS7 中移除 UISearchBar 的边框

准备在 PHP 7.2 中移除 Mcrypt

在 iOS7 中移除 UITabBar 水平分隔符

IOS KVO没有在delloc中移除导致奔溃

iOS11 SearchController - 从 navigationItem 中移除 SearchBar 会留下损坏的 UI