2015-12-24 7 views
2

Эффект, который я хочу достичь, это:Удаление волосяного покрова под навигационной панели

enter image description here

И текущее состояние моего приложения является:

enter image description here

Это настроенный моего контроллера. Я помещал панель инструментов под панель навигации. Затем я установил делегат панели инструментов на панель навигации. Я прочитал несколько сообщений об этом. Одним из предложенных решений было:

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) 
    } 

Однако этот код удаляет сверхтонкий перед вид полностью загружен, но когда вид загружен, он появляется снова. Любые решения?

+0

Вы нашли решение для этого? – SandeepAggarwal

ответ

0

Попробуйте

for parent in self.navigationController!.navigationBar.subviews { 
for childView in parent.subviews { 
    if(childView is UIImageView) { 
     childView.removeFromSuperview() 
    } 
} 
} 

Я надеюсь, что это поможет вам.

1

Я нашел решение на этом сайте, но не помню, где именно.

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 
    } 
} 
+0

Хм ... Кажется, что есть некоторые ошибки с кодом ... Это не компиляция на моем конце, и кажется, что есть некоторые проблемы с ошибками ... – Jae

0

Вы можете использовать этот

self.navigationController?.navigationBar.subviews[0].subviews.filter({$0 is UIImageView})[0].removeFromSuperview() 
+0

Не работает для меня. iOS 10. –

0

Я использую эти строки кода

UINavigationBar.appearance().shadowImage = UIImage() 
UINavigationBar.appearance().setBackgroundImage(UIImage(named: "background"), for: .default) 
0

Я не нашел никакого хорошего решения Swift 3, поэтому я добавляю этот, основанный на Ivan Bruel answer.. Его решение ориентировано на протокол, позволяет скрыть волосяной покров в любом контроллере просмотра только с одной строкой кода и без подкласса.

Добавьте этот код в модели просмотров:

protocol HideableHairlineViewController { 

    func hideHairline() 
    func showHairline() 
} 

extension HideableHairlineViewController where Self: UIViewController { 

    func hideHairline() { 
    findHairline()?.isHidden = true 
    } 

    func showHairline() { 
    findHairline()?.isHidden = false 
    } 

    private func findHairline() -> UIImageView? { 
    return navigationController?.navigationBar.subviews 
     .flatMap { $0.subviews } 
     .flatMap { $0 as? UIImageView } 
     .filter { $0.bounds.size.width == self.navigationController?.navigationBar.bounds.size.width } 
     .filter { $0.bounds.size.height <= 2 } 
     .first 
    } 

} 

Затем убедитесь, что контроллер представления, которое не нуждается сверхтонкая соответствует HideableHairlineViewController протокола и вызова hideHairline().

Смежные вопросы