Zmiana wysokości elementów NavigationBar i UIBarButtonItem wewnątrz niego w Cocoa Touch

Przypuszczam, że nie jest to ściśle zgodne z wytycznymi Apple, ale myślę, że musi to być możliwe. Chciałbym zmienić wysokość paska nawigacji wewnątrz UINavigationController i wysokość elementów UIBarButtonItem wewnątrz tego paska.

Używając sztuczki z tego pytania udało mi się zmienić wysokość paska nawigacyjnego, ale nie widzę sposobu na dostosowanie wysokości elementów przycisków paska.

Jeśli ktoś wie jak zmienić rozmiar elementów przycisku paska, proszę pomóż mi.

Author: Community, 2011-11-27

6 answers

Może ten samouczek o dostosowanym pasku nawigacyjnym pomoże ci: odtworzenie paska nawigacyjnego iBooks wood

Jeśli utworzysz BarButtonItem z UIImageView , możesz zmienić rozmiar ramki / Rozmiar boundsize w niestandardowym interfejsie UIImageView

UIImageView* imageView = [[[UIImageView alloc] initWithFrame:navigationController.navigationBar.frame] autorelease];
imageView.contentMode = UIViewContentModeLeft;
imageView.image = [UIImage imageNamed:@"NavBar-iPhone.png"];
[navigationController.navigationBar insertSubview:imageView atIndex:0];

Więc dla twojej potrzeby podałbyś -initWithFrame metodę odpowiednie wartości.

 16
Author: Pfitz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-29 14:39:20

To jest moje rozwiązanie. Działa bardzo dobrze.

@interface UINavigationBar (CustomHeight)

@end

@implementation UINavigationBar (CustomHeight)

- (CGSize)sizeThatFits:(CGSize)size {
    // Change navigation bar height. The height must be even, otherwise there will be a white line above the navigation bar.
    CGSize newSize = CGSizeMake(self.frame.size.width, 40);
    return newSize;
}

-(void)layoutSubviews {
    [super layoutSubviews];

    // Make items on navigation bar vertically centered.
    int i = 0;
    for (UIView *view in self.subviews) {
        NSLog(@"%i. %@", i, [view description]);
        i++;
        if (i == 0)
            continue;
        float centerY = self.bounds.size.height / 2.0f;
        CGPoint center = view.center;
        center.y = centerY;
        view.center = center;
    }
}
 18
Author: Vince Yuan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-09 05:32:42
static CGFloat const CustomNavigationBarHeight = 74;


@implementation WTNavigationBar



- (CGSize)sizeThatFits:(CGSize)size{
    size.width = 1024;
    size.height = CustomNavigationBarHeight;
    return size;
}

-(void)layoutSubviews {
    [super layoutSubviews];
    for (UIView *view in self.subviews) {
        SFLog(@"view.class=%@",[view class]);
        if ([view isKindOfClass:NSClassFromString(@"UINavigationItemButtonView")]) {
            float centerY = self.bounds.size.height / 2.0f;
            CGPoint center = view.center;
            center.y = centerY;
            view.center = center;
        }
    }
}


@end

W mojej aplikacji na iPada, która ma stałą orientację poziomą, stwierdziłem, że muszę kodować na twardo szerokość rozmiaru

 4
Author: Jagie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-22 06:36:52

Udało mi się zrobić coś podobnego poprzez podklasowanie UINavigationBar i nadpisanie -layoutSubviews. Kod wygląda następująco:

-(void)layoutSubviews {
    [super layoutSubviews];
    int i = 0;
    for (UIView *view in self.subviews) {
        NSLog(@"%i. %@", i++, [view description]);
        if ([view isKindOfClass:NSClassFromString(@"UINavigationButton")]) {
            view.frame = CGRectMake(0, 0, 100, 50);
        }
    }
}

Jeśli chcesz wiedzieć, jak podklasować UINavigationBar, Spójrz na to bardzo dobra odpowiedź .

Nie jestem pewien co do części NSClassFromString(@"UINavigationButton")]. To działa, ale zrobiłem to jako eksperyment, i nie jestem pewien, czy to zostanie zatwierdzone przez Apple. Mam nadzieję, że ktoś z lepszą wiedzą rzuci trochę światła.

 3
Author: phi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:17:34

Dla UINavigationbar

W iOS SDK 4.3 i nowszych, istnieje sposób (hack), aby zmienić wysokość UINavigationBar.

Aby zmienić wysokość kontrolera UINavigationController, zmień jego rozmiar ramki w funkcji viewWillAppear:animated:. Następnie wysokość pozostanie dostosowana w całej aplikacji.

Dla UIBarButtonItems
Właściwie sam na to wpadłem i jedyne, co mogłem wymyślić, to wykorzystanie initWithCustomView i Przejście W UIButton z zdefiniowana ramka.

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

/*
* Insert button styling
*/

button.frame = CGRectMake(0, 0, width, height);

UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];

W Przeciwnym Razie UIBarButtonItem ma tylko właściwość width, którą można ustawić, ale niestety nie Właściwość height. Kolejną sprytną rzeczą, którą zrobiłem z initWithCustomView, jest przejście na pasku narzędzi za pomocą przycisku i innych rzeczy, takich jak wskaźniki aktywności. Mam nadzieję, że to pomoże.

 3
Author: SimplyKiwi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-30 03:29:14

Jak bardzo tego chcesz? A jak cienki (lub gruby) chcesz zrobić swój navbar?

Jednym z rozwiązań byłoby ustawienie przekształcenia paska nawigacyjnego na skalowanie i przetłumaczenie go. Jeśli przeskalujesz go zbyt mocno, tytuł i tekst przycisku będą wyglądać niewyraźnie, ale jeśli potrzebujesz tylko ogolić kilka pikseli, możesz być w porządku.

Oto wynik skalowania go do 75% pełnej wysokości (33 piksele wysokości):

Tutaj wpisz opis obrazka

I kod, który to stworzył:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.navigationItem.title = @"Thin Navigation Bar";

    self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle: @"Press Me" style:UIBarButtonItemStyleBordered target: nil action: NULL ] autorelease];

    CGFloat scale = .75;
    CGFloat cy = 44.0 - ( 44.0 * scale );

    self.navigationController.navigationBar.transform = CGAffineTransformScale( CGAffineTransformMakeTranslation( 0, -cy / 2.0 ), 1.0, scale )  ;
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    CGFloat scale = .75;
    CGFloat cy = 44.0 - ( 44.0 * scale );

    CGRect r = self.view.frame;
    r.origin.y -= cy;
    r.size.height += cy;
    self.view.frame = r;
}

Teraz, to ma wiele problemów, które mogą, ale nie muszą być rozwiązywalne. #1 jest to, że walczysz z UINavigationController rozmiar i pozycję navbar i widok kontrolera. Animowanie między kontrolerami widoku używającymi tej techniki prawdopodobnie będzie wyglądać dziwnie.

Byłbym ciekaw, czy mógłbyś rozwiązać powiązane problemy...

Ostatnia myśl: jeśli nie używasz UINavigationController, to naprawdę nie ma wielu problemów z tym innym niż zgnieciony tekst. Można też użyć kontrolera nawigacyjnego, ale ukryć domyślny pasek nawigacyjny i dodać cienki pasek nawigacyjny do każdego widoku kontrolera widoku potomnego. Możesz nawet podklasować UINavigationBar i ustawić transformację od wewnątrz:

@interface TSThinNavBar : UINavigationBar
{
}
@end

@implementation TSThinNavBar

// assuming we'll always be constructed from a nib
- (id) initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder: aDecoder];
    if ( self != nil ) 
    {
        CGFloat scale = .75;
        CGFloat cy = 44.0 - ( 44.0 * scale );

        self.transform = CGAffineTransformScale( CGAffineTransformMakeTranslation( 0, -cy / 2.0 ), 1.0, scale )  ;
    }

    return self;
}

@end
 2
Author: TomSwift,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-02 05:44:40