编辑导航栏的阴影线UIImageView无效

时间:2016-06-08 17:55:27

标签: ios swift

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

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的视图hieararchy显示并从那里转储图像视图,结果是:

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

可以看出它是同一个物体,但它的高度是0.5而不是5。 为什么尺寸和颜色的变化没有影响? (我也改变了UIImage,但这也没有任何影响。)

1 个答案:

答案 0 :(得分:0)

首先 - 您应该通过将图像设置为shadowImage的{​​{1}}属性来执行此操作。这就是该财产的用途。请注意,您必须通过UINavigationBar设置自定义背景图片才能生效。使用下面的代码,我能够创建一个没有阴影的白色半透明导航栏。请注意,白色图像只是一个白色像素,您可以轻松地在代码中创建。

setBackgroundImage(_:forBarMetrics:)

结果是:

enter image description here

第二 - 深入了解SDK提供的组件的视图层次结构通常不是最好的主意。您无法保证视图层次结构在将来的版本中不会发生变化(或者您在旧iOS版本上可以使用的内容)。

说完了,你正在做的事情最不可能,因为在图像视图上设置override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) navigationController!.navigationBar.setBackgroundImage(UIImage(named: "white"), forBarMetrics: .Default) navigationController!.navigationBar.shadowImage = UIImage() } 不会改变该图像视图所呈现的图像。其次,Apple很可能使用自动布局来组织backgroundColor的子视图,因此UINavigationBar / frame本质上将是派生数据,而自动布局只会重置它改变它。