UINavigationBar Пользовательский цвет границы волосяного покрова - PullRequest
0 голосов
/ 21 мая 2018

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

Я НЕ хочу удалять нижнюю границу ("тень") навигационной панели.


Я пытаюсьчтобы «оформить» мое приложение обычным способом с использованием внешнего вида прокси.Я могу глобально изменить большинство визуальных атрибутов UINavigationBar с помощью кода, подобного следующему:

let navigationBarProxy = UINavigationBar.appearance()
navigationBarProxy.isTranslucent = false
navigationBarProxy.barTintColor = myBarBackgroundColor
navigationBarProxy.tintColor = myBarTextColor

Что касается нижней границы полосы «волосяной линии» (или, как известно, «тени»), я могу либоустановите значение по умолчанию, ничего не делая или указав nil:

navigationBarProxy.shadowImage = nil

... или я могу указать пользовательский цвет , назначив сплошное изображение изцвет, который я ищу:

navigationBarProxy.shadowImage = UIImage.withColor(myBorderColor)

(использует вспомогательное расширение:)

extension UIImage {
    public static func withColor(_ color: UIColor?, size: CGSize = CGSize(width: 1, height: 1)) -> UIImage? {
        let rect = CGRect(origin: CGPoint.zero, size: size)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()

        let actualColor = color ?? .clear
        context?.setFillColor(actualColor.cgColor)
        context?.fill(rect)

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image
    }
}

Однако , подход выше дает мне(на устройствах с сетчаткой) граница 1pt, 2px , тогда как по умолчанию светло-серая граница на самом деле 0.5pt, 1px (она же «линия роста волос»).

Можно ли как-нибудь получить 0,5 пт (1 пкс), пользовательскую нижнюю границу (тень) для UINavigationBar?


Я думаю, я мог бы использовать фоновое изображение, сгенерированное во время выполнения, котороепо большей части сплошная, но имеет границу размером 1 пиксель выбранного цвета, «запеченную» внизу.Но в лучшем случае это выглядит не элегантно, и я не уверен, как это будет работать при изменении высоты панели навигации: изображение нарезано , или просто растянуто, или как?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Полагаю, вы хотите удалить тень.Это должно помочь с этим.

[[UINavigationBar appearance] setShadowImage:[UIImage new]];

Если вы хотите иметь разноцветную тень, вы можете создать изображение с желаемым цветом и использовать его вместо

[UIImage new]

Вы можете использоватьчто-то вроде этого для создания образа самостоятельно

+ (UIImage *)imageWithColor:(UIColor *)color {
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    const CGFloat alpha = CGColorGetAlpha(color.CGColor);
    const BOOL opaque = alpha == 1;
    UIGraphicsBeginImageContextWithOptions(rect.size, opaque, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}
0 голосов
/ 21 мая 2018

На основе выбранного ответа, найденного здесь (с небольшими изменениями, потому что он был старым):

Как изменить цвет границы под панелью навигации?

// in viewDidLoad
UIView * navBorder = [[UIView alloc] initWithFrame:CGRectMake(0,
                                                              self.navigationController.navigationBar.frame.size.height, // <-- same height, not - 1
                                                              self.navigationController.navigationBar.frame.size.width,
                                                              1/[UIScreen mainScreen].scale)]; // <-- 5/5S/SE/6 will be 0.5, 6+/X will be 0.33
// custom color here
[navBorder setBackgroundColor:customColor];

[self.navigationController.navigationBar addSubview:navBorder];

Кредит здесь, чтобы найти масштаб программно: Получить масштаб изображения устройства (например, @ 1x, @ 2x и @ 3x)

* ПРИМЕЧАНИЕ:iPhone 6 + / X x3, поэтому высота 1 пикселя будет 0.33ptiPhone 5 / 5S / SE / 6 x2, поэтому высота 1 пикселя будет 0,5 птПротестировано в симуляторе, возможно, потребуется проверить на реальных устройствах.

Визуально то же самое, что панель навигации по умолчанию с пользовательским цветом.

...