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