Hinzufügen einer Ansicht von oben eine Navigationsleiste
Ich versuche zu erreichen, eine ähnliche Wirkung wie die gesehen in der neuen Nachrichten-app (Safari) auf iOS 7, wobei es ein progress-bar in der navigation bar selbst:
Habe ich versucht, ein paar Ansätze, und eine gefunden, die fast funktioniert. Ich bin mit einem benutzerdefinierten Unterklasse der UINavigationBar
fügt hinzu, dass meine benutzerdefinierten Fortschrittsanzeige als eine Untersicht bei der Initialisierung Zeit. Das funktioniert fast gut, aber die app stürzt ab, wenn ich versuche, um NSLayoutConstraints
zu.
Funktionierende code (ohne layout-constraints, also daher nicht anpassen, um die Ausrichtung ändert):
- (void)commonInit
{
if (!self.progressIndicator) {
self.progressIndicator = [[ECourseProgressIndicatorView alloc] initWithFrame:CGRectMake(0, self.bounds.size.height - 3, self.bounds.size.width, 3)];
[self addSubview:self.progressIndicator];
}
}
Code, den ich erwarten würde, um in der Lage sein zu verwenden (mit NSLayoutConstraint
s Hinzugefügt), aber Abstürze:
- (void)commonInit
{
if (!self.progressIndicator) {
self.progressIndicator = [[ECourseProgressIndicatorView alloc] initWithFrame:CGRectMake(0, self.bounds.size.height - 3, self.bounds.size.width, 3)];
[self addSubview:self.progressIndicator];
self.progressIndicator.translatesAutoresizingMaskIntoConstraints = NO;
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[progressIndicator]-0-|" options:0 metrics:nil views:@{@"progressIndicator": self.progressIndicator}]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[progressIndicator(==3)]-0-|" options:0 metrics:nil views:@{@"progressIndicator": self.progressIndicator}]];
}
}
Den Fehler, dass ich bei der Ausführung des Codes mit dem layout-constraints in einem Gist hier. Wenn ich nicht translatesAutoresizingMaskIntoConstraints = NO
, dann funktioniert der code auch, aber die layout-constraints, die ich angegeben sind, werden ignoriert, zugunsten der autoresizing Maske Einschränkungen.
Kann jemand Einblick geben?
P. S. ich habe anfänglich gedacht, das hinzufügen der Fortschrittsbalken als eine Sicht über die UINavigationBar (also nicht in seiner Hierarchie), aber ich finde keine Informationen, wie die position eines Sicht optisch oberhalb der Navigationsleiste (in der Z co-ordinate Bedingungen, nicht Y).
Hinweis: ich gepostet in den Apple developer Foren, bekam aber keine Antwort.
- Was bedeutet die crash-log sagen? Es ist meist hilfreich, Ihnen zu sagen, was falsch ist. Auch, eher als Unterklasse der Nav-bar, warum nicht fügen Sie einfach die Statusanzeige wie eine Untersicht der Navigationsleiste?
- Ich habe es in einem Gist mit inline, da ich nicht überwältigen wollen den thread mit hinein: gist.github.com/obeattie/...
- In Ihrem ECCourseIndicatorProgressView, Sie passieren nicht zurück
YES
für+requiresConstraintBasedLayout
tun Sie? - Ich habe nicht definiert, die Methode. Sollte Ich?
- Ich habe gerade den code für
ECourseProgressIndicatorView
auf das Wesentliche hier: gist.github.com/obeattie/6c71a04d2704a0692608#file-gistfile4-m - Nicht, es sei denn, Sie erzwingen möchten, dass auto-layout". Und auch du bist als Einstellung für den Rahmen, der Ihre Fortschritte bar. Naughty, naughty, wollen Sie nicht zu berühren, frames, wenn Sie mit "auto-layout", das ist es, was die Zwänge tun sollen. verwenden
CGRectZero
als den Rahmen, in dem initialiser. - Leider ändern, dass die Ergebnisse in die gleichen Fehler (
Auto Layout still required after executing -layoutSubviews. EProgressIndicatingNavigationBar's implementation of -layoutSubviews needs to call super.
) - Die Geltendmachung ist in
EProgressIndicatingNavigationBar
dem Sie noch nicht gezeigt, code für. - Den code in die Frage selbst war von dieser Klasse, aber ich habe den vollständigen code hier: gist.github.com/obeattie/6c71a04d2704a0692608#file-gistfile5-m
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der trick ist, fügen Sie einen Blick auf die titleView von navigationItem. Festlegen, dass view cliptobounds zu NEIN, und fügen Sie die Fortschrittsanzeige im inneren, dass.
Einfach diesen Blick in den NavigationController, nicht die NavigarionBar.
können Sie festlegen, Titleview für Ihre navigation bar...setzen Sie einfach jede UIView als Navigationsleiste titleview..dann können Sie eine beliebige Untersicht auf das UIView..
Happy Coding....