如何用swift隐藏uinavigationbar发际线

时间:2014-08-19 20:32:04

标签: ios swift uinavigationbar

我已经找到了关于这个问题的好答案,请看How to hide iOS7 UINavigationBar 1px bottom line

但我想知道如何用swift实现它,我已经尝试过这种方式

func findHairlineImageViewUnder(view:UIView!) {
    if  view is UIImageView && view.bounds.size.height <= 1.0 {
        return view
    }

    var subview: UIView

    for subview in view.subviews {
        var imageView:UIImageView = self.findHairlineImageViewUnder(subview)
        if imageView {
            return imageView
        }
    }
}

我无法成功,因为编译器告诉我

  1. 'UIView'不能转换为()
  2. 无法将表达式的类型“AnyObject”转换为“UIImageView”
  3. 类型'UIImageView'不符合协议'BoooleanType'
  4. 我知道为什么会出现这些错误,但我该如何解决?

2 个答案:

答案 0 :(得分:2)

此扩展应该这样做。

extension UINavigationController {

func hairLine(hide hide: Bool) {
    //hides hairline at the bottom of the navigationbar
    for subview in self.navigationBar.subviews {
        if subview.isKindOfClass(UIImageView) {
            for hairline in subview.subviews {
                if hairline.isKindOfClass(UIImageView) && hairline.bounds.height <= 1.0 {
                    hairline.hidden = hide
                }
            }
        }
    }

}
}

就这样称呼它:

navigationController?.hairLine(hide: true)

答案 1 :(得分:0)

您的代码中存在一些问题。

  1. 您还没有指定返回类型,因此编译器正在尝试为您解决但遇到问题。您应指定返回类型为UIView?;它应该是可选的,因为您可能无法找到该视图,并且需要返回nil
  2. 您不需要在subview循环之前声明for; for循环将隐式执行。
  3. 如果没有强制转换,将imageView声明为UIImageView将无效。但是,你首先不需要把它变为UIImageView,你可以迅速处理它。
  4. 通过在 1 中进行更改,您现在可以使用optional binding简化for循环内部,并执行if let foundView = self.findHairlineImageViewUnder(subview) { ... }
  5. 如果您找不到您正在寻找的视图,则永远不会从该功能返回任何内容。这将导致swift中的编译错误,因此请务必在最后return nil
  6. 以下是一个包​​含上述修复的工作实现:

    func findHairlineImageViewUnder(view:UIView!) -> UIView? {
        if view is UIImageView && view.bounds.size.height <= 1.0 {
            return view
        }
    
        for subview in view.subviews as [UIView] {
            if let foundView = self.findHairlineImageViewUnder(subview) {
                return foundView
            }
        }
    
        return nil
    }