Moet een TabBar-toepassing shouldAutorotateToInterfaceOrientation JA retourneren voor alle viewControllers?

Ik ben bezig met een iPhone-app met een TabBarController als rootcontroller. En deze rootcontroller is gekoppeld aan navigatiecontrollers (elk gerelateerd aan een specifieke tabbladbalkknop).

Een op deze navigatiecontrollers toont enkele foto's en dus moest ik Lanscape inschakelen, wat duidelijk niet werkte totdat ik deze code aan alle view-controllers had toegevoegd

- (BOOL)shouldAutorotateToInterfaceOrientation (UIInterfaceOrientation)toInterfaceOrientation
{
    return YES;
}

Nu echter alle oriëntaties zijn ingeschakeld in alle weergaven, waren sommige weergaven die ik niet wilde in het landschap erg lelijk :(

Enig idee hoe je de landschapsoriënte alleen in deze fotoweergave kunt verlaten en uitschakelen voor alle andere weergaven?

1

2 antwoord

Consider showing the UIViewController that needs full reorientation capabilities modally. That would be the common and in my humble opinion correct way to handle such situation.

Om je onderwerp in het kort te beantwoorden: ja, het moet JA retourneren als je wilt dat een van de ViewControllers met tabbladen heroriëntatie toestaat. Hetzelfde geldt voor viewControllers binnen de stapel van uw UINavigationControllers . Vandaar hetzelfde geldt voor elke combinatie daarvan.

Uit de technische notitie van Apple over dat onderwerp:

Waarom zal mijn UIViewController niet roteren met het apparaat?

     

Alle child view-controllers in uw UITabBarController of   UINavigationController is het niet eens over een gemeenschappelijke oriëntatieset. Naar   zorg ervoor dat al uw child view-controllers correct roteren, u   moet shouldAutorotateToInterfaceOrientation voor elke weergave implementeren   controller die elk tabblad of navigatieniveau vertegenwoordigt. Iedereen moet instemmen   op dezelfde oriëntatie voor dat roteren optreden. Dat wil zeggen, ze allemaal   zou JA moeten retourneren voor dezelfde oriëntatieposities.

In het geval dat het gebruik van een modaal gepresenteerde weergave controller geen optie voor u is - hier komt een andere manier ...

Er is ook een oplossing mogelijk die een beetje "hacky" lijkt, maar in het verleden voor mij heeft gewerkt. Ik zal het op een zeer "hacky" manier opstellen om het antwoord te vereenvoudigen.

Binnen de implementatie van shouldAutorotateToInterfaceOrientation: toInterfaceOrientation van al uw viewControllers, wordt een globale waarde geretourneerd. Wijzig die globale waarde volgens de behoeften van de momenteel weergegeven viewController. Hoewel er wordt gezegd dat een viewController maar één keer wordt gevraagd, is dit gemeenschappelijke gerucht onwaar gebleken voor mij. Dus hier komt de super hack;

Alle view-controllers in uw navigatiestack moeten de shouldAutorotate-methode als volgt implementeren:

- (BOOL)shouldAutorotateToInterfaceOrientation (UIInterfaceOrientation)toInterfaceOrientation
{
    extern BOOL gSouldAutorotateToAnyOrientationFlag;
    if (gShouldAutorotateToAnyOrientationFlag)
    {
        return YES;
    }
    return UIInterfaceOrientationIsPortrait(toInterfaceOrientation);   
}

Nu, ergens in uw app, moet u die globale vlag declareren en instantiëren - u zou deze lelijke globale vlag in uw app-gedelegeerde implementatie kunnen plaatsen, direct onder de import en boven het @implementation-blok:

BOOL gShouldAutorotateToAnyOrientationFlag = NO;

In alle viewControllers die alleen in de staande modus zouden moeten worden weergegeven, stelt u die vlag in op NEE - bijv. binnen weergaveWillAppear;

- (void)viewWillAppear:(BOOL)animated
{
    extern BOOL gShouldAutorotateToAnyOrientationFlag;
    gShouldAutorotateToAnyOrientationFlag = NO;   
}

Binnen de viewController/s die verondersteld worden getoond te zijn in een willekeurige oriëntatie, zet die vlag op YES - nogmaals in viewWillAppear;

- (void)viewWillAppear:(BOOL)animated
{
    extern BOOL gShouldAutorotateToAnyOrientationFlag;
    gShouldAutorotateToAnyOrientationFlag = YES;   
}

Op die manier wordt, wanneer de hele navigatiestapel wordt gevraagd naar zijn oriëntatiemogelijkheden, het juiste antwoord gegeven. Naar mijn ervaring wordt de hele stapel steeds opnieuw gevraagd en worden de antwoorden niet in de cache geplaatst, vandaar dat mijn hack werkte wanneer ik het nodig had. Toch lijkt het gerucht wijdverspreid dat deze antwoorden ergens op de een of andere manier in de cache zijn geplaatst en dat geruchten in bepaalde gevallen dus geldig kunnen zijn - vandaar dat ik niet verantwoordelijk zal worden gesteld als dit niet voor jou werkt (of zelfs gestemd is: D)

3
toegevoegd
waar kan ik deze globale variabele declareren (BOOL shouldAutorotateToAnyOrientationFlag)
toegevoegd de auteur Steve, de bron
zoals in de top van .h-bestand? ergens vóór @interface-aangifte?
toegevoegd de auteur Steve, de bron
Goed! Het werkt goed :)
toegevoegd de auteur Steve, de bron
Overal - bijvoorbeeld bovenop uw app-afgevaardigde (ugh, heb ik u alleen voorgesteld om de app-gemachtigde voor deze hack te gebruiken?: D). Merk op dat het NIET als klasse-instantie-variabele moet worden gedeclareerd, en daarom buiten de klasse-implementaties moet worden gedeclareerd.
toegevoegd de auteur Till, de bron
nee, bovenaan het implementatiebestand (.m) - direct onder je import zou een leuke en veel voorkomende plek zijn.
toegevoegd de auteur Till, de bron

Op het uitzicht wil je alleen landschap voor:

- (BOOL)shouldAutorotateToInterfaceOrientation (UIInterfaceOrientation)toInterfaceOrientation
{
    return UIInterfaceOrientationIsLandscape(toInterfaceOrientation);
}

U kunt UIInterfaceOrientationIsLandscape vervangen door UIInterfaceOrientationIsPortrait als dat beter past bij uw behoeften.

1
toegevoegd
Werkt niet als een van deze zich in de navigatiestapel van een UINavigationController van de UITabBarController bevindt. (let op: ik heb niet gestemd omdat dit antwoord niet helemaal verkeerd is)
toegevoegd de auteur Till, de bron