UISearchBar gepresenteerd door UISearchController in tabelkopweergave animeert te ver wanneer actief

Ik gebruik UISearchController om een ​​zoekbalk in de kopweergave van een tabelweergave te presenteren:

...
self.searchController.hidesNavigationBarDuringPresentation = NO;            
self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar;
[self.searchController.searchBar sizeToFit];
self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar;

(waarbij het tweemaal instellen van de eigenschap tableHeaderView nodig is, omdat anders de kopweergave de eerste rij overlapt, cfeen paar antwoorden op SO)

Zo ziet het eruit, perfect in positie wanneer het inactief is:
Inactieve zoekbalk op juiste positie

De zoekbalk zou gewoon op zijn plaats moeten blijven als hij actief is – ik wil niet dat hij omhoog gaat om de navigatiebalk te verbergen. Maar het animeert onverwachts naar beneden en laat een lege ruimte tussen het en de navigatiebalk:

Schermafbeelding met te ver naar beneden geanimeerde zoekbalk

Hier is een
video van vreemde zoekbalkanimatie

Als ik een zoekbalk los van UISearchController gebruik, vertoont deze niet hetzelfde gedrag wanneer deze actief wordt.

In mijn presentatieweergavecontroller heb ik self.definesPresentationContext = YES;en self.navigationController.navigationBar.translucent = YES;, en in IB geen van de ” “randen verlengen”-vakken actief zijn (alles leken mogelijke dingen die de zoekpresentatie zouden kunnen verstoren, van rondlezen).

Weet iemand hoe ik kan voorkomen dat de zoekbalk naar beneden wordt geanimeerd?


Antwoord 1, autoriteit 100%

Oude vraag, maar ik heb dit probleem kunnen oplossen door

. in te stellen

self.extendedLayoutIncludesOpaqueBars = YES;

op mijn view-controller. Ik denk dat dit probleem wordt veroorzaakt door een ondoorzichtige navigatiebalk, maar door hidesNavigationBarDuringPresentationin te stellen op NOop je zoekcontroller, waardoor de zoekbalk zichzelf onjuist positioneert wanneer gefocust.


Antwoord 2, autoriteit 43%

Ok, dus ik heb eindelijk een oplossing voor mezelf gevonden. Hoewel het meer dan waarschijnlijk is dat we andere dingen in onze code / storyboard hebben (daarom is dit een moeilijke vraag om te beantwoorden), heb ik voor het grootste deel de tutorial van Apple over UISearchController gevolgd: (https://developer.apple.com/library/ios/samplecode/TableSearch_UISearchController/Introduction/Intro.html)

Zo ongeveer al mijn code is identiek aan die van hen, maar ik kon de zoekbalk niet laten springen als ik erin klikte. Dus wat ik deed, was “onder ondoorzichtige balken” controleren voor zowel de originele tabelweergave als de tabelweergave met zoekresultaten in mijn storyboard. Dat zorgde ervoor dat de zoekbalk stopte met springen.

Maar er was nog een laatste probleem, namelijk het feit dat de eerste rij van de resultatentabel werd verborgen door de zoekbalk. Om dat op te lossen heb ik self.tableView.contentInset = UIEdgeInsetsMake(kHeightOfTableViewCells, 0, 0, 0);toegevoegd aan de viewDidLoadmethode van mijn resultatentabel. Voilà!


Antwoord 3, autoriteit 41%

Ik heb kunnen voorkomen dat UISearchBarnaar beneden verschuift door de volgende regel uit mijn ViewController te verwijderen:
self.definesPresentationContext = YES;


Antwoord 4, autoriteit 32%

definieertPresentationContext = true

override func viewDidLoad() {
        super.viewDidLoad()
        searchController = UISearchController(searchResultsController: nil)
        searchController.searchResultsUpdater = self
        searchController.hidesNavigationBarDuringPresentation = false
        searchController.dimsBackgroundDuringPresentation = true
        searchController.searchBar.searchBarStyle = UISearchBarStyle.Prominent
        self.tableView.tableHeaderView = searchController.searchBar
        definesPresentationContext = true

Antwoord 5, autoriteit 23%

Mijn beurt. Ik had dit probleem ook toen ik de WWDC-voorbeeldcode volgde.

Ik merkte op dat als ik de eigenschap scopeButtonTitles van de searchBar niet instelde, de searchBar niet zichtbaar zou zijn. Bij nader inzien had het gewoon een frame van CGRectZero. Dit betekent dat het instellen van de scopeButtonTitles het kader achter de schermen bepaalt. Dus als je geen scopeButtonTitles wilt tonen, maar toch de UISearchBar niet hard wilt coderen op een specifieke hoogte, stel dan de scopeButtonTitles in op een lege array.

self.searchController = UISearchController(searchResultsController: nil)
self.searchController.searchResultsUpdater = self
self.searchController.searchBar.scopeButtonTitles = []
self.tableView.tableHeaderView = self.searchController.searchBar

Als je de scopeButtonTitles instelt op een array van 1 strings, worden de titels van de scope-knoppen niet weergegeven, maar heb je nog steeds logica om met de weergave om te gaan, waardoor de lay-out in wezen wordt verpest.

Rekwisieten voor het QA-team van Apple (van toepassing op iOS 8)


Antwoord 6, autoriteit 22%

Ik kwam onlangs dit probleem tegen en geen van de oplossingen werkte voor mij. Misschien omdat mijn gebruikersinterface complexer is (mijn tabelweergave met zoekondersteuning in UITabController in een UiNavigationController), hoe dan ook, geen van de bovenstaande werkers.
Ik zou mijn probleem eenvoudig kunnen oplossen door dit zeer nette stukje code dat ik vond op:
UISearchController geeft navigatiebalk niet opnieuw weer bij roteren

- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar
{
    if (bar == searchController.searchBar) {
        return UIBarPositionTopAttached;
    }
    else { // Handle other cases
        return UIBarPositionAny;
    }
}

Nog één ding om toe te voegen:nadat ik de hele hiërarchie van mijn controller had ingesteld om uit te breiden onder ondoorzichtige en bovenste balken, begon mijn zoekbalk verborgen te verschijnen onder de navigatiebalk en zou direct na een rotatie zijn verschenen zou kunnen gebeuren. dat was voor mij een teken dat er een lay-outfout was en dat sommige informatie over mijn lay-out niet klopte. deze gedelegeerde methode helpt mijn controller de situatie over de anders nomadische zoekbalk te begrijpen!


Antwoord 7, autoriteit 9%

Gevonden! Dit lijkt de aanstootgevende regel te zijn in viewDidLoadvan de presenterende vc:

self.edgesForExtendedLayout = UIRectEdgeNone;

Dat verwijderd en de zoekbalk bleef zoals voorspeld op zijn plaats.


Antwoord 8, autoriteit 6%

het vinkje weghalen voor Instellingen voor scrollweergave aanpassen

en

controleren Onder de bovenste balken

Mijn probleem opgelostvoer hier de afbeeldingsbeschrijving in


Antwoord 9, autoriteit 3%

voor iOS 11 & swift 4, zet de regel hieronder in de viewController loste mijn probleem op (zoekbalk spring naar beneden):

self.edgesForExtendedLayout = .bottom

Antwoord 10

Ik neem aan dat je UISearchBar frame.original.y = 64

hebt ingesteld

daar is de code

if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) {
    [self setEdgesForExtendedLayout:UIRectEdgeNone];
}
searchBar.frame = CGRectMake(0, 0, 376, 44);

wassen kan je helpen


Antwoord 11

In mijn geval is het probleem opgelost door de navigatiebalk in te stellen op self.navigationController.navigationBar.translucent = NO;. Het lijkt erop dat de presentatielaag van de zoekbalk geen rekening houdt met de doorschijnendheid van de navigatiebalk bij het indelen van de zoekbalk.

Ik realiseer me dat dit geen perfecte oplossing is, omdat de doorschijnendheid van de navigatiebalk de lay-out elders kan verstoren, maar het lost in ieder geval het probleem op in het geval dat een niet-doorschijnende navigatiebalk een mogelijkheid is.


Antwoord 12

Zoals vermeld in de eerste post had iedereen een andere oplossing nodig. Dus hier is de mijne. Ik moest twee dingen combineren die op deze pagina worden genoemd, namelijk:

Swift 2:

   navigationController?.navigationBar.translucent = true

    edgesForExtendedLayout = .None

Antwoord 13

het is heel eenvoudig, doe gewoon clipsToBounds = waar voor de kopweergave van de tabelweergave in de zoekbalk die is toegevoegd.

countryTableView.tableHeaderView?.clipsToBounds = true

Antwoord 14

Als u UINavigationControlleren TabBargebruikt, kunt u nietgebruiken:

self.extendedLayoutIncludesOpaqueBars = true

Je hebt deze oplossing nodig: https://stackoverflow.com/a/46151063/3369381


Antwoord 15

De mijne was de volgorde van elementen in het .xib-bestand van de hoofdcontroller.

Dit werkte.

Dit werkte

Dit werkte niet.

voer hier de afbeeldingsbeschrijving in

Other episodes