2010-07-16 2 views
1

Возможно, я не делаю это правильно. Не сделав приложение для iPad, прежде чем делать то, что кажется мне естественным.UIView не позиционируется с помощью setFrame

У меня есть UIView, который будет создан из других UIViews. В частности, я хочу динамически создавать и добавлять subviews в каждое из этих подзонов. Другими словами:

UIView 
    | 
    | --> UIView 
      | 
      | --> Dynamic UIView 1 
      | --> Dynamic UIView 2 
      | --> ... 

мне удалось получить 'Dynamic UIView 1', добавив к его initWithFrame этот бит кода для загрузки XIB:

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

Это работает! Проблема, с которой я сталкиваюсь, заключается в том, что «Dynamic UIView n» всегда отображается в верхнем левом углу экрана. Если я попытаюсь изменить позицию с помощью setFrame, я получаю черный ящик при представлении кадра, однако фактический контент управления остается в верхнем левом углу.

Любые идеи? Есть лучший способ сделать это?

----- ----- Обновление

Вот скриншот зрения корня. Overview of main UIView http://www.freeimagehosting.net/uploads/460090996d.png

Весь контроль - это вызов CurrentItemsViewController. Зеленая область - это UIView, внутри которой я связан обратно в коде через ссылку в IB, в образце кода это называется «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, он вообще ничего не отображает.

alt text http://www.freeimagehosting.net/uploads/c6635ce860.png

+1

Просьба представить некоторые подробности: скриншоты, весь код 'initWithFrame:', то 'setFrame' код ... –

+0

Пусть я знаю, если вы хотите больше. – Steven

ответ

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]; 
Смежные вопросы