我正在尝试更改导航栏的窄阴影条,并使用以下代码:
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,但这也没有任何影响。)
答案 0 :(得分:0)
首先 - 您应该通过将图像设置为shadowImage
的{{1}}属性来执行此操作。这就是该财产的用途。请注意,您必须通过UINavigationBar
设置自定义背景图片才能生效。使用下面的代码,我能够创建一个没有阴影的白色半透明导航栏。请注意,白色图像只是一个白色像素,您可以轻松地在代码中创建。
setBackgroundImage(_:forBarMetrics:)
结果是:
第二 - 深入了解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
本质上将是派生数据,而自动布局只会重置它改变它。