私はおそらくこれを正しく行っていません。自分にとって自然に思えることをする前に、iPad アプリを作成したことがありません。
他のUIViewで構成されるUIViewがあります。具体的には、これらの各サブビューにサブビューを動的に作成して追加したいと考えています。言い換えると:
UIView
|
| --> UIView
|
| --> Dynamic UIView 1
| --> Dynamic UIView 2
| --> ...
xibをロードするためのこのコードをinitWithFrameに追加することで、「Dynamic UIView 1」を取得できました。
NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:@"ItemView"
owner:[[ItemViewController alloc] init]
options:nil];
ItemView *infoView = [nibViews objectAtIndex:0];
[self addSubview:infoView];
できます!私が抱えている問題は、「Dynamic UIView n」が常に画面の左上隅にレンダリングされることです。setFrame で位置を変更しようとすると、フレームを表すブラック ボックスが表示されますが、実際のコントロール コンテンツは左上に残ります。
何か案は?これを行うより良い方法はありますか?
- - - アップデート - - -
ルート ビューのスクリーンショットを次に示します。 メイン UIView の概要 http://www.freeimagehosting.net/uploads/460090996d.png
コントロール全体は、CurrentItemsViewController を呼び出します。緑色の領域は、IB のリンクを介してコードにリンクした UIView です。コード サンプルでは、「itemsUIView」と呼ばれます。CurrentItemsViewController.m 内にアイテムを追加する方法は次のとおりです。
- (id)init {
[super initWithNibName:nil
bundle:nil];
UITabBarItem *tbi = [self tabBarItem];
[tbi setTitle:@"Current"];
/* Approach 1 */
NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:@"ItemView"
owner:[[ItemViewController alloc] init]
options:nil];
ItemView *subItemView1 = [nibViews objectAtIndex:0];
/* Approach 2 - this apprach does Approach 1 in the initWithFrame method */
//ItemView *subItemView1 = [[ItemView alloc] initWithFrame:CGRectMake(120, 120, 354, 229)];
/* Approach 3 */
//ItemViewController *ctr = [[ItemViewController alloc] init];
//UIView *subItemView1 = [ctr view];
[[self view] addSubview:subItemView1];
// [[self itemsUIView] addSubview:subItemView1]; <-- doesn't render subItemView1 at all
[subItemView1 release];
[subItemView1 setFrame:CGRectMake(120, 120, 354, 229)];
[subItemView1 setBounds:CGRectMake(120, 120, 354, 229)];
return self;
}
ItemView.m の内部にはこれがありますが、アプローチ 2 と 3 によってのみ呼び出されます。
- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:@"ItemView"
owner:[[ItemViewController alloc] init]
options:nil];
ItemView *infoView = [nibViews objectAtIndex:0];
[self addSubview:infoView];
}
return self;
}
示されているように、ItemView を 3 つの異なる方法で作成しようとしましたが、それぞれが同じ結果をレンダリングします。ビューをルートビューのサブビューとして追加すると、これが得られます。レンダリングすべき場所に正方形が表示されますが、ViewItem は実際には左上隅にレンダリングされます。上記のサンプルでは、subItemView1 を追加すると、何もレンダリングされません。
代替テキスト http://www.freeimagehosting.net/uploads/c6635ce860.png