Как изменить цвет нижней границы UINavigationBar?

Я прочитал много потоков, но никто не решил этот вопрос в ясном, последовательном ответе для последней версии Swift.

Например, этот вопрос в верхнем ответе предлагает UINavigationBar.appearance().setShadowImage(). Однако такой метод не существует в последней версии быстрой версии.

Я не хочу скрывать нижнюю границу. Я просто хочу изменить цвет.

Кроме того, было бы здорово изменить высоту, но я знаю, что слишком много задаю в одном вопросе.

Изменить: Я создал изображение с 2x1 пикселем и установил его в shadowImage, но граница не изменилась:

UINavigationBar.appearance().barTintColor = UIColor.whiteColor()
UINavigationBar.appearance().shadowImage = UIImage(named: "border.jpg") //in my AppDelegate, for global appearance

Здесь изображение; это действительно мало: border image

Ответ 1

SWIFT 2.x:

Из-за удобства я расширил UIImage(), чтобы позволить мне по существу использовать его как цвет с кодом, который находится ниже.

extension UIImage {
    class func imageWithColor(color: UIColor) -> UIImage {
        let rect = CGRectMake(0, 0, 1.0, 0.5)
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0)
        color.setFill()
        UIRectFill(rect)
        let image: UIImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
}

Затем вам нужно добавить следующие строки в свой код, чтобы настроить теневое изображение viewController UINavigationBar или цвет в этом экземпляре.

// Sets Bar Background Image (Color) //
self.navigationController?.navigationBar.setBackgroundImage(UIImage.imageWithColor(UIColor.blueColor()), forBarMetrics: .Default)
// Sets Bar Shadow Image (Color) //
self.navigationController?.navigationBar.shadowImage = UIImage.imageWithColor(UIColor.redColor())

SWIFT 3.x/4.x:

Код расширения:

extension UIImage {
    class func imageWithColor(color: UIColor) -> UIImage {
        let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 0.5)
        UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
        color.setFill()
        UIRectFill(rect)
        let image : UIImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return image
    }
}

Код NavigationBar:

// Sets Bar Background Image (Color) //
navigationController?.navigationBar.setBackgroundImage(UIImage.imageWithColor(color: .blue), for: .default)
// Sets Bar Shadow Image (Color) //
navigationController?.navigationBar.shadowImage = UIImage.imageWithColor(color: .red)

Изменить 1:

Обновлен код расширения, чтобы вы могли отрегулировать размер прямоугольника без изменения непрозрачности цвета UIImage.

Изменить 2:

Добавлен код Swift 3 + Swift 4.

Ответ 2

Старые методы настройки UIKit, такие как UISomeClass.setSomething(whatIWantToSet), были переформулированы так, что вы можете напрямую установить их с помощью знака =. Итак, в моем примере вам нужно будет использовать UISomeClass.something = whatIWantToSet.

В вашем случае это UINavigationBar.appearance().shadowImage = whatYouWantToSet.

Ответ 3

Немного хитрое решение, но оно работает без необходимости кодирования и расширений. Просто добавьте в StoryBoard под навигацией Bar Progress View и установите его цвет и высоту на свое усмотрение. Если вы хотите установить полную границу, также установите прогресс на 1.

enter image description here

Таким образом, вы получите правильную границу для своей панели навигации и возможность добавить progressView в любое время в качестве дополнительного бонуса. Я знаю, я знаю... это довольно сложно, но программисты должны быть ленивыми, нет?