Может ли кто-нибудь сообщить мне, как можно изменить границу под панелью навигации?
Я хотел бы изменить его с текущего черного света на более мягкий цвет. Оцените любую помощь здесь
Может ли кто-нибудь сообщить мне, как можно изменить границу под панелью навигации?
Я хотел бы изменить его с текущего черного света на более мягкий цвет. Оцените любую помощь здесь
Я не думаю, что есть способ изменить цвет границы цвета навигации, кроме свойства tintColor
UINavigationBar
.
Я бы предложил создать UIView этого размера границы и поместить его под панель навигации/добавить его как subView
.
UIView *navBorder = [[UIView alloc] initWithFrame:CGRectMake(0,navigationBar.frame.size.height-1,navigationBar.frame.size.width, 1)];
// Change the frame size to suit yours //
[navBorder setBackgroundColor:[UIColor colorWithWhite:200.0f/255.f alpha:0.8f]];
[navBorder setOpaque:YES];
[navigationBar addSubview:navBorder];
[navBorder release];
В Swift, как @Legolas ответ:
if let navigationController = self.navigationController {
let navigationBar = navigationController.navigationBar
let navBorder: UIView = UIView(frame: CGRectMake(0, navigationBar.frame.size.height - 1, navigationBar.frame.size.width, 1))
// Set the color you want here
navBorder.backgroundColor = UIColor(red: 0.19, green: 0.19, blue: 0.2, alpha: 1)
navBorder.opaque = true
self.navigationController?.navigationBar.addSubview(navBorder)
}
Вы можете ввести viewDidLoad()
своего UIViewController
.
Для iOS 7 вы можете использовать это:
[self.navigationController.navigationBar setShadowImage:[UIImage new]];
Вы также можете добавить дочерний вид в панель навигации
Следующий код добавит синюю границу 4 пикселя под панелью навигации
UINavigationBar* navBar = self.navigationController.navigationBar;
int borderSize = 4;
UIView *navBorder = [[UIView alloc] initWithFrame:CGRectMake(0,navBar.frame.size.height-borderSize,navBar.frame.size.width, borderSize)];
[navBorder setBackgroundColor:[UIColor blueColor]];
[self.navigationController.navigationBar addSubview:navBorder];
Я обнаружил пару проблем с предыдущими ответами:
Одним из способов решения этой проблемы было бы использование автоопределения:
extension UINavigationBar {
func setBottomBorderColor(color: UIColor, height: CGFloat) -> UIView {
let bottomBorderView = UIView(frame: CGRectZero)
bottomBorderView.translatesAutoresizingMaskIntoConstraints = false
bottomBorderView.backgroundColor = color
self.addSubview(bottomBorderView)
let views = ["border": bottomBorderView]
self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[border]|", options: [], metrics: nil, views: views))
self.addConstraint(NSLayoutConstraint(item: bottomBorderView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: height))
self.addConstraint(NSLayoutConstraint(item: bottomBorderView, attribute: .Bottom, relatedBy: .Equal, toItem: self, attribute: .Bottom, multiplier: 1.0, constant: height))
return bottomBorderView
}
}
Причина, по которой я возвращаю границу, заключается в том, что во время вращения вы видите ее в середине navigation bar
, поэтому я скрываю ее во время вращения.
Несмотря на то, что navigationBar - свойство только для чтения для UINavigationController, вы можете избежать это ограничение "setValue: forKey:". Этот метод был одобрен для 5 приложений, успешно представленных в AppStore.
Вы можете подклассифицировать UINavigationBar и изменить метод drawRect: как хотите. Например,
@implementation CustomNavigationBar
- (void) drawRect:(CGRect)rect
{
[super drawRect:rect];
UIImage *backgroundImage = ImageFromColor(WANTED_COLOR);
[backgroundImage drawInRect:rect];
}
После того, как вы можете подклассифицировать UINavigationController и изменить initWithRootViewController:
- (id) initWithRootViewController:(UIViewController *)rootViewController
{
self = [super initWithRootViewController:rootViewController];
if (self)
{
CustomNavigationBar *navBar = [CustomNavigationBar new];
[self setValue:navBar forKey:@"navigationBar"];
}
return self;
}
Также вы можете изменить этот подход, создав категорию для UINavigationController и применяя метод swizzling для initWithRootViewController:
P.S. Вчера мое приложение появилось в AppStore без каких-либо проблем с этим подходом.