フレームの高さと幅を設定するためのinitWithFrameジレンマ
-
13-12-2019 - |
質問
.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
}
. 所属していません StackOverflow