質問

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

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

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

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

だからフレームの四角が自動的に設定されるにつれて、2番目のアプローチは頭に浮かぶべきです。残りの問題は、初期化装置をカスタマイズすることはできません(初期化中に追加のパラメータを渡したい)。

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

edit1: Sergioの答えに触発された、私はこの回避策で出てきました:

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

役に立ちましたか?

解決

あなたは使ってみましたか:

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

あなたの症例でうまく機能するかどうかわかりません(NIBからのビューを読み込む)が、プログラムでカスタムビューを作成すると正常に使用します。

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

編集:

あなたのビューのためにあなた自身の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

  }
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top