Je veux rendre le haut de la vue de navigation un peu plus petit. Comment y parviendriez-vous? C'est ce que j'ai essayé jusqu'à présent, mais comme vous pouvez le voir, même si je réduis la barre de navigation, la zone qu'elle occupait était toujours là (noir).
[window addSubview:[navigationController view]];
navigationController.view.frame = CGRectMake(0, 100, 320, 280);
navigationController.navigationBar.frame = CGRectMake(0, 0, 320, 20);
navigationController.view.backgroundColor = [UIColor blackColor];
[window makeKeyAndVisible];
Créez une catégorie UINavigationBar avec un sizeThatFits personnalisé.
@implementation UINavigationBar (customNav)
- (CGSize)sizeThatFits:(CGSize)size {
CGSize newSize = CGSizeMake(self.frame.size.width,70);
return newSize;
}
@end
En utilisant cette sous-classe de barre de navigation, j'ai réussi à créer une barre de navigation plus grande sur iOS 5.x à iOS 6.x sur l'iPad. Cela me donne une barre de navigation plus grande mais ne casse pas toutes les animations.
static CGFloat const CustomNavigationBarHeight = 62;
static CGFloat const NavigationBarHeight = 44;
static CGFloat const CustomNavigationBarHeightDelta = CustomNavigationBarHeight - NavigationBarHeight;
@implementation HINavigationBar
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// UIColor *titleColor = [[HITheme currentTheme] fontColorForLabelForLocation:HIThemeLabelNavigationTitle];
// UIFont *titleFont = [[HITheme currentTheme] fontForLabelForLocation:HIThemeLabelNavigationTitle];
// [self setTitleTextAttributes:@{ UITextAttributeFont : titleFont, UITextAttributeTextColor : titleColor }];
CGAffineTransform translate = CGAffineTransformMakeTranslation(0, -CustomNavigationBarHeightDelta / 2.0);
self.transform = translate;
[self resetBackgroundImageFrame];
}
return self;
}
- (void)resetBackgroundImageFrame
{
for (UIView *view in self.subviews) {
if ([NSStringFromClass([view class]) rangeOfString:@"BarBackground"].length != 0) {
view.frame = CGRectMake(0, CustomNavigationBarHeightDelta / 2.0, self.bounds.size.width, self.bounds.size.height);
}
}
}
- (void)setBackgroundImage:(UIImage *)backgroundImage forBarMetrics:(UIBarMetrics)barMetrics
{
[super setBackgroundImage:backgroundImage forBarMetrics:barMetrics];
[self resetBackgroundImageFrame];
}
- (CGSize)sizeThatFits:(CGSize)size
{
size.width = self.frame.size.width;
size.height = CustomNavigationBarHeight;
return size;
}
- (void)setFrame:(CGRect)frame
{
[super setFrame:frame];
[self resetBackgroundImageFrame];
}
@end
Pour Swift
créer une sous-classe de barre d'Uinavigation.
import UIKit
class higherNavBar: UINavigationBar {
override func sizeThatFits(size: CGSize) -> CGSize {
var newSize:CGSize = CGSizeMake(self.frame.size.width, 87)
return newSize
}
Il y aura deux bandes vierges des deux côtés, j'ai changé la largeur au nombre exact pour le faire fonctionner.
Cependant, le titre et le bouton de retour sont alignés en bas.
Il n'est pas nécessaire de sous-classer l'UINavigationBar. Dans Objective-C, vous pouvez utiliser une catégorie et dans Swift vous pouvez utiliser une extension.
extension UINavigationBar {
public override func sizeThatFits(size: CGSize) -> CGSize {
return CGSize(width: frame.width, height: 70)
}
}
J'ai trouvé le code suivant pour mieux fonctionner sur iPad (et iPhone):
- (CGSize)sizeThatFits:(CGSize)size
{
return CGSizeMake(self.superview.bounds.size.width, 62.0f);
}
Voici une jolie sous-classe Nice dans Swift que vous pouvez configurer dans Storyboard. Elle est basée sur le travail effectué par mackross, ce qui est génial, mais c'était pré-iOS7 et entraînera votre barre de navigation pas s'étendant sous la barre d'état.
class UINaviationBarCustomHeight: UINavigationBar {
// Note: this must be set before the navigation controller is drawn (before sizeThatFits is called),
// so set in IB or viewDidLoad of the navigation controller
@IBInspectable var barHeight: CGFloat = -1
@IBInspectable var barHeightPad: CGFloat = -1
override func sizeThatFits(size: CGSize) -> CGSize {
var customSize = super.sizeThatFits(size)
let stockHeight = customSize.height
if (UIDevice().userInterfaceIdiom == .Pad && barHeightPad > 0) {
customSize.height = barHeightPad
}
else if (barHeight > 0) {
customSize.height = barHeight
}
// re-center everything
transform = CGAffineTransformMakeTranslation(0, (stockHeight - customSize.height) / 2)
resetBackgroundImageFrame()
return customSize
}
override func setBackgroundImage(backgroundImage: UIImage?, forBarPosition barPosition: UIBarPosition, barMetrics: UIBarMetrics) {
super.setBackgroundImage(backgroundImage, forBarPosition: barPosition, barMetrics: barMetrics)
resetBackgroundImageFrame()
}
private func resetBackgroundImageFrame() {
if let bg = valueForKey("backgroundView") as? UIView {
var frame = bg.frame
frame.Origin.y = -transform.ty
if (barPosition == .TopAttached) {
frame.Origin.y -= UIApplication.sharedApplication().statusBarFrame.height
}
bg.frame = frame
}
}
}
J'ai pu utiliser le code de sous-classe suivant dans Swift. Il utilise la hauteur existante comme point de départ et y ajoute.
Contrairement aux autres solutions de cette page, il semble toujours redimensionner correctement lors du basculement entre l'orientation paysage et portrait.
class TallBar: UINavigationBar {
override func sizeThatFits(size: CGSize) -> CGSize {
var size = super.sizeThatFits(size)
size.height += 20
return size
}
}
Si vous souhaitez utiliser une hauteur personnalisée pour votre barre de navigation, je pense que vous devriez probablement, à tout le moins, utiliser une barre de navigation personnalisée (pas une dans votre contrôleur de navigation). Cachez la barre navController et ajoutez la vôtre. Ensuite, vous pouvez définir sa hauteur pour être celle que vous voulez.
Je suis encore débutant à iOS. J'ai résolu le problème de la manière suivante:
J'ai créé une nouvelle classe qui hérite de UINavigationBar
Je remplace la méthode suivante:
(void)setBounds:(CGRect)bounds {
[super setBounds:bounds];
self.frame = CGRectMake(0, 0, 320, 54);
}
3.Pour obtenir un arrière-plan personnalisé de la barre de navigation, j'ai remplacé la méthode suivante:
-(void)drawRect:(CGRect)rect {
[super drawRect:rect];
UIImage *img = [UIImage imageNamed:@"header.png"];
[img drawInRect:CGRectMake(0,0, self.frame.size.width, self.frame.size.height)];
}