【问题标题】:Editing navigation bar's shadow line UIImageView having no effect编辑导航栏阴影线 UIImageView 无效
【发布时间】:2016-06-08 17:55:26
【问题描述】:

我正在尝试更改导航栏的窄阴影栏并使用以下代码:

if let hairline = findNavigationBarHairline(navigationBar)
{
    hairline.bounds.size.height = 5.0
    hairline.backgroundColor = UIColor.blueColor()
}

还有这个:

    func findNavigationBarHairline(view:UIView) -> UIImageView?
    {
        if let hairline = view as? UIImageView where hairline.bounds.size.height <= 1.0
        {
            return hairline
        }
        for subview in view.subviews
        {
            if let imageView = findNavigationBarHairline(subview)
            {
                return imageView
            }
        }
        return nil
    }

这成功地找到了作为阴影线的 UIImageView,但是如果我尝试在这里更改任何内容,它就没有效果。这是在代码中设置大小/颜色之后的图像视图的 po:

(lldb) po hairline
<UIImageView: 0x126d21030; frame = (0 61.75; 320 5); userInteractionEnabled = NO; layer = <CALayer: 0x126d0b470>>

这里可以看到高度为 5,但仍以原始大小和颜色显示。如果我使用 XCode 的视图层次结构显示并从那里转储图像视图,结果如下:

> Printing description of $124: <UIImageView: 0x126d21030; frame = (0
> 64; 320 0.5); userInteractionEnabled = NO; layer = <CALayer:
> 0x126d0b470>

可以看出它是同一个对象,但是它的高度是 0.5 而不是 5。 为什么改变大小和颜色没有效果? (我也更改了 UIImage,但这也没有任何效果)。

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    首先-您应该通过将图像设置为UINavigationBarshadowImage 属性来完成此操作。这就是该属性的用途。请注意,您必须通过setBackgroundImage(_:forBarMetrics:) 设置自定义背景图像才能使其正常工作。使用下面的代码,我能够创建一个没有阴影的白色半透明导航栏。请注意,白色图像只是一个白色像素,您可以很容易地在代码中创建它。

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
    
        navigationController!.navigationBar.setBackgroundImage(UIImage(named: "white"), forBarMetrics: .Default)
        navigationController!.navigationBar.shadowImage = UIImage()
    }
    

    结果是:

    第二 - 深入了解 SDK 提供的组件的视图层次结构通常不是最好的主意。您无法保证视图层次结构在未来版本中不会发生变化(或者您所拥有的内容适用于较旧的 iOS 版本,就此而言)。

    话虽如此,您所做的很可能不起作用,因为在图像视图上设置backgroundColor 不会改变该图像视图呈现的图像。其次,Apple 很可能使用 Auto Layout 来组织 UINavigationBar 的子视图,因此 frame/bounds 本质上是派生数据,如果您更改它,Auto Layout 只会重置它。

    【讨论】:

    • 我知道这种方法并尝试过,但它具有复杂的连锁反应 - 我正在使用一个出现/消失的搜索栏以及其他内容,由于额外的要求,它整体上无法正常工作使用 shadowImage 时设置半透明。
    • @ChromiumDioxide 我正在开发一个应用程序,它使用带有自定义shadowImage 的非半透明导航栏。您确定这是一项要求吗?
    • 正如我所说,更改 UImage 也不起作用,这是为什么呢?改变大小只是为了调试时更容易看到结果。
    • @ChromiumDioxide 很难推测内部是如何工作的。也许UIImageView 不是阴影的负责人。可能UINavigationBar会主动设置图片。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多