webentwicklung-frage-antwort-db.com.de

iOS 7 Benutzerdefinierte UINavigationBar-Titelansicht wird verschoben, wenn Sie den neuen View Controller verschieben oder platzieren

Ich verwende eine benutzerdefinierte Titelansicht für eine UINavigationBar mit dem folgenden Code:

// Set a label to the nav bar
THLabel *titleLabel = [[THLabel alloc] init];
titleLabel.text = @"Test";
titleLabel.font = [UIFont fontWithName:APP_FONT size:22.0];
titleLabel.frame = CGRectMake(0, 0, 100, 30);
titleLabel.textAlignment = NSTextAlignmentCenter;
titleLabel.textColor = CUSTOM_LIGHT_BLUE;
titleLabel.strokeColor = kStrokeColor;
titleLabel.strokeSize = kStrokeSize;
self.navigationItem.titleView = titleLabel;

Das Problem ist, dass beim Anzeigen eines neuen Viewcontrollers und anschließender Rückkehr zum ursprünglichen Viewcontroller diese benutzerdefinierte Ansicht verschoben und neu zentriert wird. Bitte sehen Sie sich das Video für eine Demonstration davon an.

Das Video finden Sie hier: https://www.youtube.com/watch?v=961CCVQmpJM&feature=youtu.be

Ich habe die automatische Größenänderung aller Unteransichten für den Navigationscontroller deaktiviert, und zwar sowohl für das Storyboard als auch für den Code für jeden Ansichtscontroller:

    // Set the navigation bar hidded on the log in view
    UINavigationController* mainViewController = (UINavigationController*)self.appDelegate.window.rootViewController;
    [mainViewController setNavigationBarHidden:YES];
    [[mainViewController navigationBar] setAutoresizesSubviews:NO];

Es wird jedoch immer noch die Größe geändert! Wie kann ich damit aufhören - was mache ich falsch? Vielen Dank!

24
PhilBot

Es ist für mich nur reproduzierbar, wenn ich die Einstellung titleView code in viewWillAppear platziere. Das Verschieben nach viewDidLoad behebt das Problem

33
Alex Peda

Ich würde das Label in eine UIView einbetten. Der Interface Builder möchte aus bestimmten Gründen, die mit Ihrem Problem zusammenhängen, nicht direkt eine UILabel in die titleView setzen.

Versuchen Sie auch, die autoResizingMask auf UIViewAutoresizingFlexibleTopMargin zu setzen. Nach meiner Erfahrung verhält sich jede benutzerdefinierte Ansicht in Bars auf diese Weise besser.

4
Rivera

Das passierte auch für mich. Zwei Dinge, die Sie tun könnten:

1) Vergewissern Sie sich, dass das Navigations-Setup entweder in viewDidLayoutSubviews oder in viewDidLoad durchgeführt wird, wie in der obigen Antwort erwähnt 

2) Ich hatte einen linken und einen rechten Bar-Button als null, aber ich habe sie erst nach dem Setzen des Titeletiketts aufgerufen. Stellen Sie sicher, dass Sie die Elemente der rechten und linken Schaltflächen auf Null setzen (wenn Sie sie natürlich nicht verwenden), bevor Sie das Titellabel auf Titelansicht setzen.

1
hellorrr

Was für mich funktionierte, war, im View-Controller eine Variable zu erstellen, die die gewünschte Titelansicht enthält, und sie dann in viewDidLoad zu initialisieren. Dann können Sie diese Ansicht auf self.navigationItem.titleView in viewWillAppear setzen und sie sollte korrekt angezeigt werden. Keine Einstellung für autoResizeMask oder rightBarButtons usw.

Beispiel:

class ViewController {
    var myTitleImage: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        myTitleImage = UIImageView(frame: CGRect(x: 0, y: 0, width: 25, height: 25))
        myTitleImage.contentMode = .scaleAspectFit
        myTitleImage.image = #imageLiteral(resourceName: "my_title_image")
        // etc...
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationItem.titleView = self.myTitleImage
    }    
}
0
Alphonsus

In meinem Fall ist es passiert, weil ich UIBarButton vor titleView gesetzt habe. Die Einstellung von titleView sollte an erster Stelle stehen. Funktioniert jetzt perfekt.

0

Wenn ich auf die Antwort von @Alex Peda weiter eingiehe, stelle ich fest, dass unter iOS7 außerhalb von viewDidLoad eine minimale Titelbreite für einen benutzerdefinierten Titel vorhanden ist. Hier ist, was ich unten mache. Beachten Sie, dass im Folgenden ein paar Methoden zu meinem Code aufgeführt sind.

#define MAX_TITLE_WIDTH 400
#define MIN_TITLE_WIDTH 150

- (void) setNavBarTitle: (NSString *) newTitle;
{
    if (!newTitle) newTitle = @"";
    NSMutableString *title = [newTitle mutableCopy];

    if (![_titleView.text isEqualToString:title]) {

        NSAttributedString *attrTitle = [UIAppearance attributedString:title withFontType:FontTypeTitle | FontTypeBold | FontTypeItalic size: 40.0 andOtherAttributes:@{NSForegroundColorAttributeName: [UIColor blackColor]}];
        _titleView.attributedText = attrTitle;
        [_titleView sizeToFit];

        // In iOS7, if you set the nav bar title with a custom view outside of viewDidLoad, there appears to be a minimum title width. Narrower custom view titles are not centered properly. I'm working around this by centering the text in the label, and setting the width of the label to the minimum width.
        if ([Utilities ios7OrLater]) {
            if (_titleView.frameWidth < MIN_TITLE_WIDTH) {
                _titleView.textAlignment = NSTextAlignmentCenter;
                _titleView.frameWidth = MIN_TITLE_WIDTH;
            }
        }

        if (_titleView.frameWidth > MAX_TITLE_WIDTH) {
            _titleView.frameWidth = MAX_TITLE_WIDTH;
        }
    }

    self.navigationItem.titleView = _titleView;
}
0
Chris Prince