Schakel ik de auto voor een specifieke subview tijdens runtime?

Ik heb een weergave moet zijn van het frame gemanipuleerd programmatisch – het is een soort van document bekijken dat doorloopt naar de inhoud, vervolgens gedraaid en ingezoomd rond een superview door het manipuleren van het frame oorsprong. Auto gevechten met deze tijdens runtime.

Uitschakelen van de auto geheel lijkt een beetje hard, omdat het in redelijkheid kan worden gebruikt voor het verwerken van de lay-out voor de andere weergaven. Het lijkt erop dat wat ik zou willen is een soort van “null constraint”.

 

14 Replies
  1. 168

    Ik had het zelfde probleem. Maar ik heb het opgelost.

    Ja, kunt u deze uitschakelen van de auto-opmaak tijdens runtime voor een specifieke UIView, in plaats van het uitschakelen van het voor de hele xib of storyboard, die standaard is ingesteld in Xcode 4.3 en hoger.

    Set translatesAutoresizingMaskIntoConstraints te YES, voordat u het frame van uw subview:

    self.exampleView.translatesAutoresizingMaskIntoConstraints = YES;
    self.exampleView.frame = CGRectMake(20, 20, 50, 50);
    • Dit lijkt overkill voor wat meer complexe zaken met veel uitzicht. Voor iets simpels als dit, dit is goed.
    • Shabby, maar voor mij werkt.
    • verwijder subview en het weer toevoegen kan de prestaties doen afnemen.Kunnen wij archief betere oplossing?
    • Ik verduidelijkt het antwoord. Het verwijderen en opnieuw toevoegen van het subview is niet nodig.
    • of in swift self.exampleView.setTranslatesAutoresizingMaskIntoConstraints(true)
    • Het toont me waarschuwing : “Niet in staat om tegelijkertijd te voldoen aan de randvoorwaarden.”
    • U redde mijn dag … translatesAutoresizingMaskIntoConstraints … wie verzint eigenschappen als shakinghead
    • dit is geweldig. Na dagen van tranen, dit redde mijn dag
    • Als u nog steeds problemen hebt met onverwachte beperkingen ook instellen view.autoresizingMask = AutoresizingMask(rawValue: 0).
    • Indien u de bekijk al heeft een aantal beperkingen ingesteld, zal gooien de “Niet in staat om tegelijkertijd te voldoen aan de randvoorwaarden.” typische fout. Voordat u belt translatesAutoresizingMaskIntoConstraintsone moet verwijderen, de weergave van de beperkingen van het eerste.

  2. 49

    Ik had een soortgelijk probleem waar de Auto was het overschrijven van een aantal van mijn frame-instelling bij het uitvoeren van het moment (ik had een dynamische weergave die in sommige gevallen aangedrongen op een nieuwe view-controller…duwen en vervolgens te drukken op Terug zou opnieuw de oorspronkelijke weergave).

    Ik kwam dit door mijn manipulatie code in viewDidLayoutSubviews van mijn View-Controller. Dit lijkt te krijgen, genaamd na welke beperking mojo wordt genoemd, maar voordat viewDidAppear, zodat de gebruiker is niets wijzer.

    • Niet voor zichzelf.navigationItem.titleView. Nog steeds niet respecteren van het frame te wijzigen.
    • Als je probeert om de mest met het frame van een titel bekijken, ik zou hem in een container bekijken en voeg de container als u een aangepaste weergave van de navigationItem.
    • Dit werkte voor mij goed. Ik zou verspilde 2h:22m bonken met mijn hoofd tegen de spreekwoordelijke muur voor het ontdekken van deze oplossing.
    • Bedankt, man. Ik ben in mijn tweede dag worstelen met dit probleem en nu werkt het!
  3. 26

    Misschien net instelling translatesAutoresizingMaskIntoConstraints te YES (en het niet toevoegen van extra beperkingen die van invloed die weergave) laat je het frame zonder te vechten de automatische lay-out-systeem.

  4. 17

    In iOS 8 instellen u kunt een NSLayoutConstraint actief moet zijn of niet. Dus als ik met interface builder, ik al mijn beperkingen om een OutletCollection en vervolgens activeren of deactiveren met behulp van:

    NSLayoutConstraint.deactivateConstraints(self.landscapeConstraintsPad)
    NSLayoutConstraint.activateConstraints(self.portraitConstraintsPad)

    De specifieke toepassing ik gebruik het voor hier is het hebben van verschillende beperkingen in portrait en landscape modus en ik activeren/deactiveren gebaseerd op de rotatie van het apparaat. Het betekent dat ik soms complexe lay-out wijzigingen in de interface builder voor beide richtingen, en nog steeds gebruik maken van de automatische lay-out, zonder de uitgebreide automatische lay-out code.

    Of je kan het activeren /deactiveren met behulp van removeConstraints en addConstraints.

    • Sorry voor het kapen van een dergelijke vraag, maar mag ik vragen hoe je erin geslaagd om toe te voegen lay-out voor verschillende lay-outs in de eerste plaats? Ik kan niet lijken te vinden van een optie in de interface builder voor het inschakelen/uitschakelen van een beperkingen. Of heb je gewoon toevoegen beperkingen voor beide lay-outs en negeer de interface builder klagen over ongeldige (dwingende) beperkingen?
    • Ook kunt u doen door met behulp van grootte-klassen: developer.apple.com/library/ios/recipes/…, maar ik kon het niet op deze manier want ik was de ondersteuning van iOS 7 en grootte klassen niet volledig ondersteunen iOS 7. Ik deed het met de verlaging van de prioriteit van de strijdige beperking. Niet ideaal, maar het voorkomt dat de waarschuwing. Ik denk dat dit is hoe ik deed het toch….
  5. 8

    Ik weet niet of dit zal helpen iemand anders, maar ik schreef een categorie om dit handig omdat ik vind mezelf doen dit veel.

    UIView+DisableAutolayoutTemporarily.h

    #import <UIKit/UIKit.h>
    
    @interface UIView (DisableAutolayoutTemporarily)
    
    //the view as a parameter is a convenience so we don't have to always
    //guard against strong-reference cycles
    - (void)resizeWithBlock:(void (^)(UIView *view))block;
    
    @end

    UIView+DisableAutolayoutTemporarily.m

    #import "UIView+DisableAutoResizeTemporarily.h"
    @implementation UIView (DisableAutoResizeTemporarily)
    
    - (void)resizeWithBlock:(void (^)(UIView * view))block
    {
        UIView *superview = self.superview;
        [self removeFromSuperview];
        [self setTranslatesAutoresizingMaskIntoConstraints:YES];
        __weak UIView *weakSelf = self;
        block(weakSelf);
        [superview addSubview:self];
    }
    
    @end

    Ik gebruik het als volgt:

    [cell.argumentLabel resizeWithBlock:^(UIView *view) {
        [view setFrame:frame];
    }];

    Hoop dat het helpt.

    • Briljant ! Ik gebruikt een aangepaste versie van de code aan het schrijven van een eenvoudige “hideControl” – functie voor een UIView. In feite stelt de hoogte van een UIView naar 0, maar, en dat is cruciaal, maakt gebruik van je code om Auto verwerken van het goed (in tegenstelling tot het gebruik van “someView.hidden=TRUE”). Zo regelt dat verscheen onder de verborgen controle, en had de verticale afstand gekoppeld, zou nu omhoog op het scherm om het gat te vullen, waar de verborgen-eerder verscheen.
    • U redde mijn leven ! Duizend dank !
  6. 6

    Kunt u de translatesAutoresizingMaskIntoConstraints type Boolean, de Waarde Ja in de door de Gebruiker Gedefinieerde Runtime Kenmerken van de UIView u wilt in het xib/storyboard.

  7. 2
    • Open project in 4.5
    • Selecteer storyboard
    • Open het bestand inspecteur
    • Onder Interface Builder Document vink ‘Gebruik Auto’

    U kunt verdeeld over meerdere storyboards als u wilt gebruiken de auto voor sommige standpunten.

    • Dat schakelt de auto voor de gehele storyboard/penpunt. Wat was ik op zoek naar een manier was (ideaal programmatische) hebben het bijzonder subviews binnen een storyboard/nib geen gebruik van auto, terwijl de rest doen wat het storyboard of de penpunt opgegeven.
    • U kan gebruik maken van meerdere storyboards en alleen maar te roepen degenen met/zonder auto als dat nodig is: //Initialiseren van de storboard & detail view-controller voor de weergave UIStoryboard* sb = [UIStoryboard storyboardWithName:@”Storyboard” bundel:[NSBundle mainBundle]]; DetailViewController *dvController = [sb instantiateViewControllerWithIdentifier: vermelding.viewnaam];
  8. 1

    Voor mij werkte het maken van het subview programmatisch, in mijn geval de automatische lay-out was in de war te sturen met een beeld dat ik nodig had om te roteren rond het middelpunt, maar zodra ik deze bekijk het programmatisch gewerkt.

  9. 1

    In mijn ogen had ik een Label en een Tekst. Het label had pan gebaar. De label te verplaatsen fijn tijdens het slepen. Maar toen ik de tekst selectievakje toetsenbord op het etiket zet haar positie op de oorspronkelijke locatie die is gedefinieerd in de automatische lay-out. Het probleem heb opgelost wanneer heb ik het volgende toegevoegd in de swift voor het label. Ik heb dit in viewWillAppear maar het kan toegevoegd worden vrijwel overal waar u toegang tot het veld doel.

    self.captionUILabel.translatesAutoresizingMaskIntoConstraints = true
  10. 0

    Dit gebeurde bij mij in een project zonder storyboards of xib bestanden. Alle 100% – code. Ik had een advertentie-banner op de bodem en wilde het uitzicht grenzen om te stoppen op de banner. Het uitzicht zou verkleinen zichzelf automatisch na het laden. Ik probeerde elke resolutie op deze pagina, maar geen van hen werkte.

    Ik uiteindelijk alleen het maken van een sub-weergave met de verkorte hoogte en plaatste dat in de hoofdweergave van de controller. Dan al mijn content ging in het submenu weergave. Dat is het probleem opgelost is eenvoudig, zonder iets te doen dat voelde alsof het zou gaan tegen de stroom in.

    Ik denk als je wilt een beeld dat is niet de normale grootte, dat vult het venster vervolgens moet u gebruik maken van een sub voor die.

  11. 0

    Die ik heb ontmoet op een vergelijkbaar scenario, waar ik lid van een project dat werd geïnitieerd met auto-layout, maar ik moest bij het maken van dynamische aanpassingen aan verschillende standpunten. Hier is wat heeft gewerkt voor mij:

    1. GEEN uitzicht hebben op of onderdelen vastgelegd in interface builder.

    2. Voeg uw mening puur programmatisch te beginnen met alloc/init en het instellen van de frames op de juiste wijze.

    3. Gedaan.

  12. 0

    In plaats van het uitschakelen van de auto, ik zou gewoon de berekening van de nieuwe beperking met het frame dat u wilt vervangen. Dat lijkt mij de juiste weg. Als u het aanpassen van onderdelen die afhankelijk zijn van beperkingen, pas ze dus.

    Bijvoorbeeld, als u een verticale beperking van de 0 tussen de twee weergaven (myView en otherView), en je hebt een pan gebaar of iets dat stelt de hoogte van de myView dan kunt u het herberekenen van de beperking met de gecorrigeerde waarden.

    self.verticalConstraint.constant = newMyViewYOriginValue - (self.otherView.frame.origin.y + self.otherView.frame.size.height);
    [self.myView needsUpdateConstraints];
  13. 0

    Voor diegenen die gebruik maken van de automatische lay-out, please check out mijn oplossing hier. Je moet maken @IBOutlet’s van de beperkingen die u wilt aanpassen en wijzig vervolgens hun constanten.

  14. -16

    als het xib-bestand:

    1. het selecteren van de .xib-bestand
    2. selecteer de “File’ s Owner”
    3. toon de Hulpprogramma ‘ s
    4. klik op: “Bestand Inspecteur”
    5. Onder “Interface Builder Document” disable: “Gebruik Auto”
    • Nee, dat schakelt de auto voor de hele xib. Wat was ik op zoek naar een manier om een bepaalde subview uit de auto systeem.
    • Hij wil alleen uitschakelen Auto voor één bekijken.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *