UIView, Autoresizing & XIB

Hello à  tous,


 


Je suis actuellement confronté à  un problème.



Ce que je fais:


J'affiche une UIView à  partir d'un xib comme template:




NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:nibName owner:nil options:nil];

// Find a view inside the nib file
for (id obj in topLevelObjects)
{
if([obj isKindOfClass:[UIView class]])
{
view = obj;
break;
}
}

Voila en gros ce que je fais actuellement.


Lorsque je charge un nib/xib, je charge toutes ses propriétés.

Je veux avoir la liberté de rajouter autant de nib que je veux en utilisant uniquement les propriétés du xib.


Le soucis, c'est que comme c'est pas un viewController, y'a un certain nombre de choses qui ne fonctionnent pas. Par exemple l'autoresizing ne fonctionne pas.


 


Comment je peux faire pour que ça fonctionne?


Je suis ouvert à  toutes proposition :)


Réponses

  • Pas de tout compris ce que tu veux faire :)


  • J'aimerais pouvoir faire de l'autoresizing à  partir des propriétés du xib.


    Dans le code au dessus, je montre comment "je charge le xib".


  • Je crois que l'autoresizing se met en marche à  partir du moment où ta vue est affichée.



  • <UIView: 0x17418d9c0; frame = (0 0; 320 50); autoresize = W+BM; layer = <CALayer: 0x17403cea0>>

    J'ai ça.


    Seulement quand elle s'affiche le 320 sevrait s'étendre ou je loupe quelque chose?


  • Joanna CarterJoanna Carter Membre, Modérateur
    octobre 2014 modifié #6
    Qu'est ce que tu fais avec la vue après que tu l'as chargé ?


  • Qu'est ce que tu fais avec la vue après que tu l'as chargé ?




     


    Je l'affiche ^^'


  • AliGatorAliGator Membre, Modérateur
    Avec un autoresizingMask à  W+BM si je ne m'abuse ça veut dire "largeur (Width) flexible ET position par rapport au bas (Bottom Margin) flexible".
    Donc, une fois que tu as placé ta vue (qui fera 320 au moment où tu vais un addSubview pour l'ajouter), si jamais ENSUITE, plus tard, sa vue parente se redimensionne, alors ta vue devrait s'étirer en largeur proportionellement.

    Par contre si ta vue parente fait 400, et que ta vue, une fois extraite du XIB, fait 320, le fait de juste faire "[parent addSubview:vueDuXib]" ne va pas magiquement changer la frame de vueDuXib pour qu'elle se mette à  faire 400. (Et encore heureux d'ailleurs ! Sinon ça veut dire que tu ne pourrais pas positionner comme tu veux les subviews que tu rajoutes dans une vue parente).

    Si tu veux que, LORS DE L'AJOUT de vueDuXib dans sa vue parente, alors vueDuXib s'adapte pour faire la taille de la vue parente, bah il faut que tu lui dises, il n'y a pas de miracle. Typiquement tu vas faire "vueDuXib.frame = parent.bounds" donc.

    AutoResizingMask c'est pour dire quelles dimensions de ta vue se resizent automatiquement... quand leur vue parente change de frame. Pas quand tu ajoutes la vue à  sa vue parente.


  • Avec un autoresizingMask à  W+BM si je ne m'abuse ça veut dire "largeur (Width) flexible ET position par rapport au bas (Bottom Margin) flexible".

    Donc, une fois que tu as placé ta vue (qui fera 320 au moment où tu vais un addSubview pour l'ajouter), si jamais ENSUITE, plus tard, sa vue parente se redimensionne, alors ta vue devrait s'étirer en largeur proportionellement.


    Par contre si ta vue parente fait 400, et que ta vue, une fois extraite du XIB, fait 320, le fait de juste faire "[parent addSubview:vueDuXib]" ne va pas magiquement changer la frame de vueDuXib pour qu'elle se mette à  faire 400. (Et encore heureux d'ailleurs ! Sinon ça veut dire que tu ne pourrais pas positionner comme tu veux les subviews que tu rajoutes dans une vue parente).


    Si tu veux que, LORS DE L'AJOUT de vueDuXib dans sa vue parente, alors vueDuXib s'adapte pour faire la taille de la vue parente, bah il faut que tu lui dises, il n'y a pas de miracle. Typiquement tu vas faire "vueDuXib.frame = parent.bounds" donc.


    AutoResizingMask c'est pour dire quelles dimensions de ta vue se resizent automatiquement... quand leur vue parente change de frame. Pas quand tu ajoutes la vue à  sa vue parente.




     


    Le problème c'est que ma vue "parente" hérite de toutes les propriétés de mon xib.

    Je dois passer à  coté de quelque chose. Faut que je me pose la dessus.

  • AliGatorAliGator Membre, Modérateur
    Qu'est ce que tu appelles "hérite de toutes les propriétés de ton XIB" ? Ta vue parente on est d'accord elle, elle ne vient pas du XIB que tu es en train d'extraire, elle est à  part, c'est celle dans laquelle tu vas justement mettre la vue que tu extrais du XIB, right?
  • Ceci pourrais t'aider à  m'aider Ali? ^^



    po parentView
    <UIWindow: 0x14663b260; frame = (0 0; 736 414); autoresize = W+BM; gestureRecognizers = <NSArray: 0x1742430c0>; animations = { position=<CABasicAnimation: 0x17003e900>; bounds.origin=<CABasicAnimation: 0x1702274a0>; bounds.size=<CABasicAnimation: 0x17022a080>; }; layer = <UIWindowLayer: 0x170226f80>>
  • ...Sinon je peux pas faire un truc du genre:



    if (self.view.autoresizingmask = W+BM){
    //Je redimensionne en conséquence à  la mano
    }

    //En gros


  • AliGatorAliGator Membre, Modérateur

    Ceci pourrais t'aider à  m'aider Ali? ^^


    po parentView
    <UIWindow: 0x14663b260; frame = (0 0; 736 414); autoresize = W+BM; gestureRecognizers = <NSArray: 0x1742430c0>; animations = { position=<CABasicAnimation: 0x17003e900>; bounds.origin=<CABasicAnimation: 0x1702274a0>; bounds.size=<CABasicAnimation: 0x17022a080>; }; layer = <UIWindowLayer: 0x170226f80>>

    Ca ne répond pas trop à  ma question. Qu'est ce que tu entends par ta phrase "la vue parente hérite de toutes les propriétés de ton XIB", je ne comprend juste pas la phrase. De quelles propriétés tu parles, et comment pourrait-il y avoir héritage ?


  • Ca ne répond pas trop à  ma question. Qu'est ce que tu entends par ta phrase "la vue parente hérite de toutes les propriétés de ton XIB", je ne comprend juste pas la phrase. De quelles propriétés tu parles, et comment pourrait-il y avoir héritage ?




     


    Je me suis mal exprimé.


    vueParente = vueDuNib ;


     


    C'est pas de l'héritage, je me suis mal exprimé.

  • AliGatorAliGator Membre, Modérateur
    Ah, tu veux dire que depuis le début de la conversation, quand tu parles de "vue parente" tu parles de la vue racine de ton XIB, et pas de la vue dans laquelle tu vas ajouter la vue racine de ton xib en tant que subview ? Du coup j'espère qu'on s'est pas embrouillés depuis le début... ;)


    Bon et quel est le problème alors, si ta vue racine du XIB récupère comme tu le dis l'AutoresizingMask du XIB, quelle est la question alors ?

    Ceci dit il me semble qu'on ne peut pas définir d'AutoResizingMask pour la vue racine d'un XIB, donc soit tu les définis par code, soit tu encapsules dans ton XIB ta vue racine dans une vue de plus haut niveau, juste pour pouvoir lui mettre les AutoResizingMask, puis tu la redescends d'un niveau.
Connectez-vous ou Inscrivez-vous pour répondre.