Frage

Ich habe eine zugehörige UIView-Unterklasse erstellt.xib-Datei.Diese UIView-Unterklasse soll in einem UIViewController verwendet werden.In der Steuerung gibt es meiner Meinung nach zwei Möglichkeiten, wie wir die UIView-Unterklasse instanziieren:

MyUIView *myView=[[MyUIView alloc] initWithFrame:aRect];

und

MyUIView *myView = [[[NSBundle mainBundle] loadNibNamed:@"MyUIView" 
                                                  owner:self 
                                                options:nil] lastObject]; 

Ich bevorzuge den ersten Ansatz oder seine Varianten, mit denen ich eine benutzerdefinierte Initialisierung durchführen kann.Das einzige Problem ist, dass ich das Rechteck eines Frames angeben muss, das bereits in angegeben wurde.xib (Ich meine Rahmenhöhe und -breite von MyUIView).Ja, ich kann es wieder fest codieren in aRect, aber das ist mühsam zu pflegen (zB wenn ich die Position der Benutzeroberflächen ändere.xib, ich muss aktualisieren aRect, zu).

Daher sollte der zweite Ansatz in den Sinn kommen, da das Rahmenrechteck automatisch gesetzt wird.Das verbleibende Problem ist, dass ich den Initialisierer nicht anpassen kann (z. B. möchte ich während der Initialisierung zusätzliche Parameter übergeben).

Was ist Ihre Präferenz?Welches ist Ihrer Meinung nach besser?

BEARBEITUNG1:Inspiriert von Sergios Antwort habe ich diese Problemumgehung gefunden:

// In MyViewController.m
MyUIView *myView=[[MyUIView alloc] initWithFrame:CGRectMake(x, y, 0.0, 0.0)];

// In MyView.m
- (id)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        self = [[[NSBundle mainBundle] loadNibNamed:@"UnmovableTagView" 
                                              owner:self 
                                            options:nil] lastObject]; 
        [self setFrame:CGRectMake(frame.origin.x, 
                                  frame.origin.y, 
                                  [self frame].size.width, 
                                  [self frame].size.height)]; 
        // frame's width and height already determined after 
        // loadNibNamed was called
       ...
    }
    return self;
}
War es hilfreich?

Lösung

Haben Sie versucht zu verwenden:

MyUIView *myView=[[MyUIView alloc] initWithFrame:CGRectZero];

Ich weiß nicht, ob es in Ihrem Fall funktioniert (Laden der Ansicht von einer Feder), aber ich verwende es erfolgreich, wenn ich meine benutzerdefinierte Ansicht programmgesteuert erstelle.

Sie können es versuchen.

BEARBEITEN:

sie könnten Ihre eigenen definieren init methode für Ihre Ansicht:

-(id)initWithPosition:(CGPoint)pos;

und dann ruf an:

-(id)initWithPosition:(CGPoint)pos {

  if (self = [super initWithFrame:{pos,{0,0}}]) {
    self = [[[NSBundle mainBundle] loadNibNamed:@"UnmovableTagView" 
                                          owner:self 
                                        options:nil] lastObject]; 
    [self setFrame:CGRectMake(frame.origin.x, 
                              frame.origin.y,  
                              [self frame].size.width,    
                              [self frame].size.height)]; 
     // frame's width and height already determined 
     // after loadNibNamed was called

  }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top