Frage

Ich habe eine App, die eine Tab-Leiste und Navigationsleiste für die normale Interaktion hat. Einer meiner Bildschirm ist ein großer Teil des Textes, so dass ich der Benutzer erlauben, tippen vollen Umfang nutzen zu gehen (Art wie Photos.app).

Die Navigationsleiste und Tab-Leiste ausgeblendet ist, und ich den die Rahmen der Textansicht Vollbild zu sein. Das Problem ist, es über 50px weißen Raum, wo die Tab-Leiste verwendet werden. Sie können, wenn von diesem Screenshot sehen:

entfernt tot Images Link

Ich bin mir nicht sicher, was das verursacht. Das Leerzeichen ist definitiv nicht die Ansicht hinter der Textansicht, wie ich es Hintergrundfarbe auf rot gesetzt, nur um sicher zu sein. Was verursacht diese werden könnte?

** UPDATE **

Ich habe einige Treffertests in einer UIWindow Unterklasse und fand heraus, dass die Leerzeichen tatsächlich die undokumentierte / nicht veröffentlichte UILayoutContainerView ist. Dies ist die übergeordnete Ansicht des tabBar. Ich glaube nicht, es direkt empfohlen wird, diese Ansicht zu manipulieren, so wie kann ich die Tab-Leiste verbergen?

** UPDATE # 2 **

Ich habe self.view den Rahmen vor und nach der Animation, und es sieht aus wie die übergeordnete Ansicht nicht genug Größe ändern.

nach Vollbild geht, der Rahmen ist der Ansicht, nur 411 Pixel hoch. Ich habe manuell mit dem Rahmen versucht, Messing und auch autoResizeMask ohne Glück zu setzen.

**** UPDATE: Hier ist das Endergebnis ****

- (void)toggleFullscreen {
    isFullScreen = !isFullScreen;  //ivar

    //hide status bar & navigation bar
    [[UIApplication sharedApplication] setStatusBarHidden:isFullScreen animated:YES];
    [self.navigationController setNavigationBarHidden:isFullScreen animated:YES];

    [UIView beginAnimations:@"fullscreen" context:nil];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:.3];

    //move tab bar up/down
    CGRect tabBarFrame = self.tabBarController.tabBar.frame;
    int tabBarHeight = tabBarFrame.size.height;
    int offset = isFullScreen ? tabBarHeight : -1 * tabBarHeight;
    int tabBarY = tabBarFrame.origin.y + offset;
    tabBarFrame.origin.y = tabBarY;
    self.tabBarController.tabBar.frame = tabBarFrame;

    //fade it in/out
    self.tabBarController.tabBar.alpha = isFullScreen ? 0 : 1;

    //resize webview to be full screen / normal
    [webView removeFromSuperview];
    if(isFullScreen) {
                //previousTabBarView is an ivar to hang on to the original view...
        previousTabBarView = self.tabBarController.view;
        [self.tabBarController.view addSubview:webView];

        webView.frame = [self getOrientationRect];  //checks orientation to provide the correct rect

    } else {
        [self.view addSubview:webView];
        self.tabBarController.view = previousTabBarView;
    }

    [UIView commitAnimations];
}

(beachten Sie, dass ich Textview zur Webansicht eingeschaltet, aber die gleichen Arbeiten für die ursprüngliche Textansicht)

War es hilfreich?

Lösung

ich genau dieses Problem hatte, wo ich Animieren die Tab-Leiste und Navigationsleiste an den unteren und oberen Rande des Bildschirms jeweils ein 49px hohen weißen Raumes verlassen, wo die Tab-Leiste war.

Es stellt sich heraus, dass der Grund meinen neuer „Vollbild“ Blick war nicht wirklich den Raum füllt war, weil ich die Vollbild-Ansicht als ein Subview der Navigationssteuerung nach Ansicht Zugabe wurde, die selbst ein Kind der Tab-Leiste Controller war.

Um es zu beheben, hat ich einfach die neue Vollbild-Ansicht (in Ihrem Fall die Ansicht mit dem gesamten Text) als Subview der UITabBarController Ansicht.

[[[self tabBarController] view] addSubview:yourTextView];

Dann alles, was Sie tun müssen, ist, stellen Sie sicher, dass der Rahmen Ihre Subview der 480 x 320 Pixel und es soll den Bildschirm (einschließlich der Fläche, die zuvor der mysteriöse weiße Raum war) füllen

Andere Tipps

Sie können auf jeden Fall etwas, das durch Verschieben des Rahmens der Ansicht, dass die Tab-Leiste Bildschirm ausgeschaltet ist richtig erscheint. Ich weiß, dass jemand anders erwähnt, dass versuchen, und Sie sagten, es hat nicht funktioniert, aber ich vermute, dass das Problem ist, dass Sie nicht die Textviews Maske Setup haben die Größe richtig, wenn Sie versucht haben. Im Folgenden finden Sie Code, die funktionieren sollte:

- (void)viewDidLoad {
  [super viewDidLoad];
  currentlyHidden = NO;
}

- (void) hideStuff {
  SO2AppDelegate *appDelegate = (id)[[UIApplication sharedApplication] delegate];
  self.navigationController.navigationBarHidden = YES;

  CGRect newFrame = appDelegate.tabBarController.view.frame;
  newFrame.size.height += appDelegate.tabBarController.tabBar.frame.size.height;
  appDelegate.tabBarController.view.frame = newFrame;
}

- (void) showStuff {
  SO2AppDelegate *appDelegate = (id)[[UIApplication sharedApplication] delegate];

  CGRect newFrame = appDelegate.tabBarController.view.frame;
  newFrame.size.height -= appDelegate.tabBarController.tabBar.frame.size.height;
  appDelegate.tabBarController.view.frame = newFrame;

  self.navigationController.navigationBarHidden = NO;
}

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {  
  if (currentlyHidden) {
    [self showStuff];
    currentlyHidden = NO;
  } else {
    [self hideStuff];
    currentlyHidden = YES;
  }
}

Darüber hinaus, da dies auf jeden Fall empfindlich ist, wie Sie Ihre nibs etc Setup, ich bin aa Projekt veröffentlichen online, so dass Sie es herunterladen und einen Blick auf sie bekommen. Es ist ein ziemlich minimal Demo, nur eine Navigation basierend Projekt, bei dem die Delegierten eine Registerkarte Controller einrichtet und bettet die View-Controller aus der Hauptspitze. Der Rest ist in dem RootViewController nib und Klasse. Die Stäbe werden umgeschaltet, wenn eine Berührung beginnt, so dass nur auf den Bildschirm tippen. Offensichtlich in einer realen Anwendung müssen Sie die Scroll-Ansicht so stopfen den Inhalt anzupassen nicht zu springen erscheinen.

Haben gesetzt Sie die Ansicht Controller hidesBottomBarWhenPushed Eigenschaft auf YES? Sie müssen dies in Ihrem initWithNibName:bundle: oder initWithCoder: Verfahren einzustellen. Wenn es um den nav-Controller gedrückt wird, soll dies die Tab-Leiste verbergen und den Inhalts im Hinblick auf den Boden nach unten erstrecken machen.

Vielleicht gibt es eine andere Ansicht, die einen integrierten Teil der Registerkarte Bar ist? Das heißt, etwas zusätzlich zu verstecken. Dies wird Ihnen helfen zu sehen, welche Ansichten sind um.

for (UIView *viewy in [self.navigationController.view subviews])
{
    NSLog([viewy description]);
}

Ich fand, dass, wenn Sie die neue Ansicht markieren werden Sie auf den Navigationsstapel schieben werden mit der folgenden Zeile der Tab-Leiste versteckt, solange sie auf dem Stapel ist.

scrollViewController.hidesBottomBarWhenPushed = YES;

Ich glaube, das Problem ist, dass Sie immer noch in der Tab-Leiste Controller sind, dann ich auch ein paar Probleme mit diesem getroffen habe, und am Ende der Schaffung von zwei Ansichten für meine AppDelegate zu steuern, die Tab-Leiste Controller und eine separate uiview, die zu übernehmen Kommando alles, was die Tab-Leiste Controller versucht hält. Sie könnten Ihren Blick auf die AppDelegate passieren und es verwenden, da vielleicht?

Versuchen Sie, die TabBarControllers machen Ansicht größer als der Bildschirm, so dass die Tab-Leiste wird Bildschirm versteckt weg, solange Sie dies tun vor die neuen Viewcontroller gesetzt ist, dann wird seine Ansicht der Größe der füllen neue Rahmen!

In meinem Test habe ich die TabBarController: shouldSelectViewController: Delegatmethode zu prüfen, welche View-Controller ist über Strom zu werden und die TabBarController.view.frame entsprechend eingestellt. Zum Beispiel:

- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
{
    if( viewController == second)
        tabBarController.view.frame = CGRectMake( 0, 20, 320, 500);
    else
        tabBarController.view.frame = CGRectMake( 0, 20, 320, 460);
}

Wenn dies immer noch nicht ganz, was Sie brauchen, versuchen, in die hidesBottomBarWhenPushed Eigenschaft von UIViewController suchen. Bei der Einstellung ja dies die untere Leiste auszublenden machen, wenn der Controller auf einen Navigationsstapel geschoben wird.

Ich würde den Blick auf das Fenster bewegen, wenn Sie gehen Vollbild wählen. z.

myView = [self.view retain];
self.view = nil;
[window addSubview:myView];

und zurück zu gehen:

[myView removeFromSuperView];
self.view = myView;
[myView release];
myView = nil;

die Ansicht als Kind des Fensters Durch das Hinzufügen, kann es völlig Vollbild sein und oben auf der Tab-Leiste sein wird.

Sie können dann kombinieren diese mit

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:@"UIDeviceOrientationDidChangeNotification" object:nil];

erkennen Rotation. (Ich glaube, dass Sie dies mit view.transform kombinieren = CGAffineTransformMakeRotation zu machen, drehen ...?)

Ich hatte ähnliches Problem. Als Harry erwähnt ist es ein Grund für die Navigation Controller, die innere Steuerung der Tab Bar Controller ist. Gefunden eine andere Art und Weise, wie Sie Ihre Ansicht neu zu zeichnen und zu korrigieren Rahmen haben, in Ihrem Controller Add folgende:.

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

    // Here you can make your tabBarControlelr.view.hidde = true or use any animation that hides UITabBar. I made
    [TabBarController setTabBarHidden:YES];

    self.navigationController.view.frame = CGRectMake(self.navigationController.view.frame.origin.x, self.navigationController.view.frame.origin.y, self.navigationController.view.frame.size.width, self.navigationController.view.frame.size.height + 50);
    [self.navigationController.view setNeedsLayout];

 }

Und hier ist, wie ich es verstecken. Ich kann es direkt machen Aufruf der Methode von TabBarControlelr oder Klassenmethode Wrapper:

+ (void)setTabBarHidden:(BOOL)hidden
{
    AppDelegate *delegate = [UIApplication sharedApplication].delegate;
    TabBarController *tabBarController = (TabBarController *) delegate.window.rootViewController;

    if ([tabBarController isKindOfClass:[TabBarController class]]) {
        [tabBarController setTabBarHidden:hidden];
    }
}


- (void)setTabBarHidden:(BOOL)hidden
{
    if (self.tabBar.hidden == hidden) {
        return;
    }

    if (hidden == NO) {
        self.tabBar.hidden = hidden;
    }

    [UIView animateWithDuration:0.15 animations:^{
        self.tabBar.frame = CGRectOffset(self.tabBar.frame, 0, ( hidden ? 50 : -50 ));
    } completion:^(BOOL finished) {
        self.tabBar.hidden = hidden;
    }];
}

Wenn Sie Interface Builder verwenden, stellen Sie sicher der automatischen Größen richtig in der Größe Inspector eingestellt ist. Wenn Sie den UITextView in Code erstellen, stellen Sie sicher, dass Sie den Rahmen festgelegt, dass groß genug und dass die Eltern Ansicht (und es ist Eltern) sind auch groß genug. Der Einfachheit halber fügen Sie den Blick auf das Fenster direkt, und dann nach innen von dort bewegen.

Um einen Blick auf seine Superview zu bewegen:

- (void)moveViewToSuperview:(UIView *)view
{
    UIView *newSuperview = [[view superview] superview];
    [view removeFromSuperview];
    [newSuperview addSubview:view];
    [newSuperview bringSubviewToFront:view];
}

Haben Sie den Text zu zwingen versucht, „re-write“ selbst (Zurücksetzen des .text Eigenschaft jedes Objekt Sie verwenden)? Ich habe viele Fälle gehabt, wo Ansichten einfach nicht erneut überprüfen oder ihre Daten neu aufgebaut, und zwingen scheint die einzige Lösung zu sein. Ist dies nicht gut von einem User Experience Sicht ist, können Sie versuchen, die nav / tabbars transparent, nachdem der Benutzer berührt zu machen, und bevor sie verschwinden. Dies erstreckt sich normalerweise die Ansicht auf die volle Größe des Bildschirms.

Wenn die UITabBarController durch eine RootViewController (Navigation) gedrückt wird. Sie können versuchen Sie Folgendes:

Zuerst Ausblenden der Statusleiste / Tab Bar;

[self.navigationController pushViewController:aBlankViewController animated:NO];
[self.navigationController popViewControllerAnimated:NO];

Es sollte möglich sein, den weißen Raum zurückzufordern, obwohl der Bildschirm während der Einstellung schockieren wird ...

Ich habe ein ähnliches Problem aufgetreten ist, diese Diskussion hilfreich: UIWebView auf iPad Größe

Tony 's Antwort half mir entdecken, dass, wenn Sie eine Subview erstellen ist es hilfreich zu Setup-Code ähnlich wie folgt aus:

self.tabBarController.tabBar.frame = self.view.bounds;

Setzen Sie den Code in eine Vorbereitung für segue wie diese, funktioniert perfekt für mich:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"ViewPhoto"]) {

    ImageView *vc = [segue destinationViewController];

    NSInteger selectedIndex = [[self.tableView indexPathForSelectedRow] row];

        NSString *Title = [photoNames objectAtIndex:selectedIndex];
        [vc setSelectedTitle:[NSString stringWithFormat:@"%@", Title]];

        vc.hidesBottomBarWhenPushed = YES;

        }
    }

Fügen Sie das zusätzliche amt des Raumes auf die Dimension der Ansicht, also wenn es Rechteck CGRectMake (0,0,320,460) war es CGRectMake (0,0,320,480) ... Das ist mir passiert, Im n ot genau sicher, warum , könnte es ahve mit der zugrunde liegenden Ansicht zu tun Sie Ihren Text Blick auf off setzen, sondern nur die Dimension hinzugefügt werden, sollte es tun

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top