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:
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:
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 hidesNavigationBarDuringPresentation
in te stellen op NO
op 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 viewDidLoad
methode van mijn resultatentabel. Voilà!
Antwoord 3, autoriteit 41%
Ik heb kunnen voorkomen dat UISearchBar
naar 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 viewDidLoad
van 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
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 UINavigationController
en TabBar
gebruikt, 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 niet.