Storyboard (général)

lucluc Membre
janvier 2015 modifié dans API UIKit #1

Bonjour,


 


un doute...


 


si par exemple je place graphiquement dans le storyboard un UILabel, c'est a moi d'écrire la déclaration ; 


UILabel *test = [[UILabel alloc ....


 


maintenant vue que dans le storyboard les dimensions de mon UILabel sont indiqués dois-je écrire dans mon .m; 


 


UILabel *test = [[UILabel alloc] init];


ou


UILabel *test = [[UILabel alloc] initWithFrame:CGRectMake(10, 240, 300, 30)];


 


??


 


donc puis-je m'affranchir de lui indiquer les coordonnées a l'initialisation quand le storyboard les possédes.


 


:)


Réponses

  • Si tu place un élément dans un storyboard graphiquement c'est pour ne pas le faire de manière programmatique (en ligne de code). Donc pas d'alloc / init. Ca sera fait au moment ou le storyboard est chargé.


     


    Pour ce qui est de la taille du label : tu peux le définir graphiquement avec les contraintes (hauteur, largeur, distance du bord ou d'un autre élément etc.)


     


    Ensuite si tu veux y accéder dans ton code il faut faire un contrôle+glisser vers le ViewController pour ajouter un IBOutlet (une référence à  ton label auquel tu pourras accéder). Pour facilement faire le lien il faut cliquer avant sur "Show the assistant editor" (les deux cercles en haut à  droite dans xCode)


     


    seb


  • J'ai bon :)


     


    Merci seb.




  • J'ai bon :)




     


    ça c'est drôle !


     


     




    maintenant vue que dans le storyboard les dimensions de mon UILabel sont indiqués dois-je écrire dans mon .m; 


     


    UILabel *test = [[UILabel alloc] init];


    ou


    UILabel *test = [[UILabel alloc] initWithFrame:CGRectMake(10, 240, 300, 30)];


     


    ??




     


    Qu'y a-t-il de bon là  dedans par rapport au post de seb ?

  • On recommence :


    A partir du moment où tu utilises StoryBoard (ou Interface Builder d'une façon générale), tu n'as qu'à  instancier, non pas les UIButton, UISlider... mais les IBOutlet et les IBAction dans ton code. Tu connectes ensuite dans IB les outlets aux boutons, sliders, etc. pour pouvoir les utiliser dans ton code (exemple : faire afficher la bonne valeur de "float taratata" au IBOutlet UISlider)  et ces boutons aux actions (exemple, une IBAction change la valeur "taratata" lorsqu'on bouge le slider).


     


    Tu peux créer ton GUI en code (plus facile lorsque tu as besoin de 50 boutons d'un coup, organisés d'une certaine façon par exemple), mais si c'est avec IB, c'est pour NE PAS coder.


  • J'oubliais : Tu peux disposer des UIView graphiquement dans IB, et les relier à  une classe dérivée de UIVIew pour créer ton propre GUI. Tu disposes dans IB tes vues, et tu crées leur graphisme en code.


  • Joanna CarterJoanna Carter Membre, Modérateur
    février 2015 modifié #7

    N'oubliez pas ; avec Xcode 6, on peut utiliser IB_DESIGNABLE et IBInspectable pour réaliser les UIViews ou les NSViews, avec lesquelles on peut voir l'apparence de la vue dans Interface Builder.


     



    // CustomView.h

    IB_DESIGNABLE
    @interface CustomView : NSView

    @property (nonatomic) IBInspectable NSUInteger radius;

    @end




    // CustomView.m

    @implementation CustomView

    - (void)prepareForInterfaceBuilder
    {
    [super prepareForInterfaceBuilder];

    if (_radius == 0)
    {
    self.radius = MIN(self.bounds.size.width, self.bounds.size.height) / 2.0;
    }

    [self setNeedsDisplay:YES];
    }

    - (void)setRadius:(NSUInteger)radius
    {
    _radius = radius;

    [self setNeedsDisplay:YES];
    }

    - (instancetype)initWithCoder:(NSCoder *)coder
    {
    self = [super initWithCoder:coder];

    if (self)
    {
    _radius = MIN(self.bounds.size.width, self.bounds.size.height) / 2.0;
    }

    return self;
    }

    - (instancetype)initWithFrame:(NSRect)frameRect
    {
    self = [super initWithFrame:frameRect];

    if (self)
    {
    _radius = MIN(frameRect.size.width, frameRect.size.height) / 2.0;
    }

    return self;
    }

    - (void)drawRect:(NSRect)dirtyRect
    {
    [super drawRect:dirtyRect];

    NSPoint centre = NSMakePoint(NSMidX(dirtyRect), NSMidY(dirtyRect));

    NSPoint origin = NSMakePoint(centre.x - self.radius, centre.y - self.radius);

    NSRect rect = NSMakeRect(origin.x, origin.y, self.radius * 2.0, self.radius * 2.0);

    NSBezierPath *path = [NSBezierPath bezierPathWithOvalInRect:rect];

    [[NSColor redColor] setStroke];

    [path stroke];
    }

    @end

Connectez-vous ou Inscrivez-vous pour répondre.