UIView не позиционируется с помощью setFrame - PullRequest
1 голос
/ 16 июля 2010

Я, вероятно, не делаю это правильно. Я не делал приложение для iPad, пока не сделал то, что мне кажется естественным.

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

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, я получаю черный квадрат при представлении кадра, однако фактическое содержимое элемента управления остается в верхнем левом углу.

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

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

Вот скриншот корневого представления. Обзор основного 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, он вообще ничего не рендерит.

альтернативный текст http://www.freeimagehosting.net/uploads/c6635ce860.png

1 Ответ

1 голос
/ 17 июля 2010

Попробуйте установить кадр, прежде чем добавить его в качестве подпредставления.

Ваш код:

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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...