ios - 去除导航栏下的细线

标签 ios xcode swift uitoolbar

我想要达到的效果是:

enter image description here

我的应用程序的当前状态是:

enter image description here

这是我的 View Controller 的设置。我在导航栏下方放置了一个工具栏。然后,我将工具栏的委托(delegate)设置为导航栏。我读过几篇关于此的文章。提供的一种解决方案是:

navigationController?.navigationBar.shadowImage = UIImage();
navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)

但是,这会导致导航栏变白,失去效果。所以我从这篇文章中得到了以下代码(UISegmentedControl below UINavigationbar in iOS 7):

    @IBOutlet weak var toolbar: UIToolbar!
    var hairLine: UIView = UIView()
    override func viewDidLoad() {
        super.viewDidLoad()
        doneButton.enabled = false

        for parent in self.navigationController!.navigationBar.subviews {
            for childView in parent.subviews {
                if childView is UIImageView && childView.bounds.size.width == self.navigationController!.navigationBar.frame.size.width {
                    hairLine = childView
                    print(hairLine.frame)
                }
            }
        }
    }

    func removeHairLine(appearing: Bool) {
        var hairLineFrame = hairLine.frame
        if appearing {
            hairLineFrame.origin.y += toolbar.bounds.size.height
        } else {
            hairLineFrame.origin.y -= toolbar.bounds.size.height
        }
        hairLine.frame = hairLineFrame
        print(hairLine.frame)
    }

    override func viewWillAppear(animated: Bool) {
        removeHairLine(true)
    }

    override func viewWillDisappear(animated: Bool) {
        removeHairLine(true)
    }

但是,此代码在 View 完全加载之前删除了细线,但在加载 View 时,它又出现了。有什么解决办法吗?

最佳答案

我在这个网站上找到了解决方案,但不记得具体在哪里。

objective-C :

@interface YourViewController () {
  UIImageView *navBarHairlineImageView;
}

- (void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:animated];
  navBarHairlineImageView = [self findHairlineImageViewUnder:self.navigationController.navigationBar];
  navBarHairlineImageView.hidden = YES;
}

- (UIImageView *)findHairlineImageViewUnder:(UIView *)view {
  if ([view isKindOfClass:UIImageView.class] && view.bounds.size.height <= 1.0) {
    return (UIImageView *)view;
  }
  for (UIView *subview in view.subviews) {
      UIImageView *imageView = [self findHairlineImageViewUnder:subview];
      if (imageView) {
          return imageView;
      }
  }
  return nil;
}

swift :

class YourViewController: UIViewController {
    var navBarLine: UIImageView?

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        navBarLine = findHairlineImageViewUnderView(self.navigationController?.navigationBar)
        navBarLine?.hidden = true
    }

    func findHairlineImageViewUnderView(view: UIView?) -> UIImageView? {
        if view.isKindOfClass(UIImageView.classForCoder()) && view.bounds.height <= 1 {
            return view as? UIImageView
        }
        for subview in view.subviews {
            if let imgView = findHairlineImageViewUnderView(subview) {
                return imgView
            }
        }
        return nil
    }
}

关于ios - 去除导航栏下的细线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34452920/

相关文章:

ios - swift - if 语句和数组

swift - MTLVertexDescriptor 中的矩阵

ios - 数组 objectAtIndex <huge number> 上的 RangeException #Core Data

ios - 堆叠式 UIViewController 中的 UITextView 委托(delegate)问题

ios - 如何使用 Parse TableView 传输图像

ios - 你如何获得特定设备的当前位置?

objective-c - 加载时浏览器中的 UIActivityViewIndicator 如果字符串包含 http ://remove it

ios - UIView 高度在较大的设备上拉伸(stretch) IOS

ios - 注册按钮仅点击图像边界

ios - 如何使用 guard 同时解包 Swift 可选类型和强制转换类型?