1

私はおそらくこれを正しく行っていません。自分にとって自然に思えることをする前に、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

4

1 に答える 1

1

サブビューとして追加する前に、フレームを設定してみてください。

あなたのコード:

NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:@"ItemView" 
                                              owner:[[ItemViewController alloc] init]
                                            options:nil];
ItemView *infoView = [nibViews objectAtIndex:0];
self addSubview:infoView];

次のようにする必要があります。

NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:@"ItemView" 
                                              owner:[[ItemViewController alloc] init]
                                            options:nil];
ItemView *infoView = [nibViews objectAtIndex:0];
infoView.frame = CGRectMake( put your rect here );
[self addSubview:infoView];
于 2010-07-16T22:46:46.543 に答える