1

.xib ファイルに関連付けられた UIView サブクラスを作成しました。この UIView サブクラスは、UIViewController で使用されます。コントローラーでは、UIView サブクラスをインスタンス化する方法が 2 つあります。

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

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

私は、カスタム初期化を実行できる最初のアプローチまたはその変形を好みます。唯一の問題は、既に で指定されているフレームの rect を指定する必要があることです。xib(フレームの高さと幅を意味しますMyUIView)。はい、もう一度ハードコーディングできますaRectが、これは維持するのが面倒です (たとえば、.xib で UI の位置を変更するとaRect、 も更新する必要があります)。

したがって、フレーム四角形が自動的に設定されるため、2 番目のアプローチを念頭に置く必要があります。残りの問題は、イニシャライザをカスタマイズできないことです (たとえば、初期化中に追加のパラメータを渡したいなど)。

あなたの好みは何ですか?あなたの意見では、どちらが優れていますか?

EDIT1:セルジオの答えに触発されて、私はこの回避策を思いつきました:

// 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;
}
4

1 に答える 1

6

使用してみましたか:

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

あなたの場合(ペン先からビューをロードする)で機能するかどうかはわかりませんが、カスタムビューをプログラムで作成するときにうまく使用します。

試してみることができます。

編集:

initビューに独自のメソッドを定義できます。

-(id)initWithPosition:(CGPoint)pos;

そして、次のように呼び出します。

-(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
   
  }
 
于 2012-07-29T10:49:59.757 に答える