iOS 7 UISearchDisplayController zoekbalk overlapt statusbalk tijdens het zoeken

Ik ben mijn app aan het updaten voor iOS 7 en ik ben bezig om al mijn weergaven aan te passen aan de nieuwe transparante statusbalk (mijn app gebruikt nog steeds ondoorzichtige navigatiebalken).

Het was relatief eenvoudig om de statusbalk in elke weergave aan te passen, behalve één groot probleem dat ik heb met een UISearchBar die is aangesloten op een UISearchDisplayController in een van mijn weergavecontrollers.

De zoekbalk lijkt normaal te worden weergegeven, zoals hieronder weergegeven:

Zoekbalk

Het probleem is dat zodra ik begin met zoeken, de navigatiebalk verdwijnt (zoals het hoort), maar al het andere gaat ook omhoog om de statusbalk te overlappen:

Gebroken zoekbalk

Dit lijkt niet te werken zoals bedoeld, aangezien het donker worden van het scherm 20 pixels onder de zoekbalk plaatsvindt, waar de zoekbalk zou moeten eindigen.

Is hier een ingebouwde oplossing voor in iOS 7? Ik zou liever niet het frame handmatig moeten aanpassen voor elke weergave telkens wanneer de gebruiker begint en eindigt met zoeken.

Bedankt!


Antwoord 1, autoriteit 100%

Het plaatsen van de volgende regel in de viewDidLoad loste het voor mij op:

self.edgesForExtendedLayout = UIRectEdgeNone;

Antwoord 2, autoriteit 24%

Bedankt hodade dat je me op het goede spoor hebt gebracht! Uw oplossing werkte, behalve dat het alleen het frame van de zoekbalk verplaatste, waardoor mijn andere subviews op de verkeerde plek bleven. Het enige dat ik heb veranderd, was om alle subweergaven in mijn weergave te verplaatsen en deze te animeren.

Bedankt!

-(void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect statusBarFrame =  [[UIApplication sharedApplication] statusBarFrame];
        [UIView animateWithDuration:0.25 animations:^{
            for (UIView *subview in self.view.subviews)
                subview.transform = CGAffineTransformMakeTranslation(0, statusBarFrame.size.height);
        }];
    }
}
-(void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        [UIView animateWithDuration:0.25 animations:^{
            for (UIView *subview in self.view.subviews)
                subview.transform = CGAffineTransformIdentity;
        }];
    }
}

Antwoord 3, autoriteit 15%

U gebruikt misschien geen doorschijnende navigatiebalk?
Zo ja, dan lost dit het op.

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
    self.navigationController.navigationBar.translucent = YES;
}
- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
    self.navigationController.navigationBar.translucent = NO;
}

Antwoord 4, autoriteit 8%

Plaats de volgende code in -(void) ViewDidLoad. Het werkt voor iOS 7 en latere versies

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
}

UPDATE:

if(SYSTEM_VERSION_GREATER_THAN(@"6.1")) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
}

Antwoord 5, autoriteit 7%

Ik heb onderstaande code gebruikt om het probleem op te lossen.

   - (void) viewDidLayoutSubviews
{
         if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
        {
            CGRect viewBounds = self.view.bounds;
            CGFloat topBarOffset = self.topLayoutGuide.length;
            viewBounds.origin.y = topBarOffset * -1;
            self.view.bounds = viewBounds;
        }
}

Antwoord 6, autoriteit 7%

Dit lijkt het probleem te beschrijven dat ik had; hopelijk helpt het iemand in mijn vorige positie.

  1. Subklasse uw SearchDisplayController die is toegevoegd aan uw UIViewController/UITablewViewController,

  2. Voeg zoiets als dit toe aan de implementatie:

    - (void)setActive:(BOOL)visible animated:(BOOL)animated
    {
        [super setActive:visible animated:animated];
        [self.searchContentsController.navigationController setNavigationBarHidden: NO animated: NO];
        CGRect frame = self.searchResultsTableView.frame;
        frame.origin.y = CGRectGetHeight(self.searchContentsController.navigationController.navigationBar.frame);
        frame.size.height = CGRectGetHeight(frame) - CGRectGetMinY(frame);
        self.searchResultsTableView.frame = frame;
        frame = self.searchBar.frame;
        self.searchBar.frame = frame;
        [self.searchContentsController.view insertSubview:self.searchBar aboveSubview:self.searchResultsTableView];
    }
    

Antwoord 7, autoriteit 6%

Ik denk dat het misschien helpt om dit toe te voegen aan viewDidLoad:

if([self respondsToSelector:@selector(setEdgesForExtendedLayout:)])
{
    self.edgesForExtendedLayout = UIRectEdgeNone;
}

Antwoord 8, autoriteit 3%

gewoon toevoegen

self.definesPresentationContext = YES;

u kunt hier meer lezen: UISearchController en definieertPresentationContext

en uit Apple-documentatie: UISearchController-documentatie

Opmerking:UISearchDispalyController is verouderd in iOS7, gebruik in plaats daarvan UISearchController in iOS8, bovenstaande methode gebruikt UISearchController


Antwoord 9, autoriteit 2%

In mijn geval stonden de weergaven onder de zoekbalk op de juiste plaats, alleen de zoekbalk overlapte de statusbalk. In dit geval werkt dit stukje code prima:

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {        
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
        CGRect statusBarFrame =  [[UIApplication sharedApplication] statusBarFrame];
        CGRect frame = self.searchBar.frame;
        frame.origin.y += statusBarFrame.size.height;
        self.searchBar.frame = frame;
    }
}
- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
    if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) {
        CGRect statusBarFrame =  [[UIApplication sharedApplication] statusBarFrame];
        CGRect frame = self.searchBar.frame;
        frame.origin.y -= statusBarFrame.size.height;
        self.searchBar.frame = frame;
    }
}

Ik hoop dat het nuttig zal zijn voor anderen


Antwoord 10

-(void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect statusBarFrame =  [[UIApplication sharedApplication] statusBarFrame];
        CGRect frame = controller.searchBar.frame;
        frame.origin.y += statusBarFrame.size.height;
        controller.searchBar.frame = frame;
    }
}
-(void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect statusBarFrame =  [[UIApplication sharedApplication] statusBarFrame];
        CGRect frame = controller.searchBar.frame;
        frame.origin.y -= statusBarFrame.size.height;
        controller.searchBar.frame = frame;
    }
}

Antwoord 11

De bovenstaande antwoorden werken alleen als je navigatiebalk zichtbaar is. Als je je navigatiebalk verborgenhebt, probeer dan dit:

-(void)viewDidAppear:(BOOL)animated{
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
    CGRect statusBarFrame =  [[UIApplication sharedApplication] statusBarFrame];
    [self.tableView setFrame:CGRectMake(self.tableView.frame.origin.x, self.tableView.frame.origin.y+statusBarFrame.size.height, self.tableView.frame.size.width, self.tableView.frame.size.height)];
    }
}

Op basis van dit bericht: UISearchBar overlapt statusbalk in iOS


Antwoord 12

Subclasseer uw SearchDisplayControllerdie is toegevoegd aan uw UIViewController/UITablewViewControlleren voeg dit toe aan de implementatie ervan –

- (void)setActive:(BOOL)visible animated:(BOOL)animated
{
    if(self.active == visible) return;
    [self.searchContentsController.navigationController setNavigationBarHidden:YES animated:NO];
    [super setActive:visible animated:animated];
    [self.searchContentsController.navigationController setNavigationBarHidden:NO animated:NO];
    if (visible) {
        [self.searchBar becomeFirstResponder];
    } else {
        [self.searchBar resignFirstResponder];
    }
}

Other episodes