Как подойти к общему xib или элементам управления для нескольких контроллеров представления?

У меня есть анимированный персонаж, сосуществующий с другими обычными элементами управления в xib. Все работает хорошо. Никаких проблем. Анимация выполняется с помощью перелистывания изображения UIImageView. Анимационный движок (конечный автомат), запускаемый таймером, запускает шоу. Персонаж использует шесть UIImageView для визуализации различных частей персонажа, которые необходимо анимировать.

Теперь я рассматриваю возможность усложнения приложения путем добавления еще нескольких UIViewController (и их xib). Как вы могли догадаться, мой персонаж должен был существовать в любом xib, который скользит поверх предыдущего.

Что может быть лучшим подходом к реализации этого? Я полагаю, что мог бы скопировать и вставить UIImageView и создать новый механизм анимации (или передать указатель) каждому новому xib.

Во многих случаях мне нужно, чтобы новый xib покрывал только 2/3 предыдущего xib, и это сработало бы, но я не уверен, что это работает. Не уверен насчет событий и того, как они будут работать с двумя перекрывающимися xib (если это вообще возможно).

Пока я экспериментирую, я решил спросить и посмотреть, может ли кто-нибудь, кто был здесь раньше, поделиться интересным подходом или двумя.


person martin's    schedule 11.04.2011    source источник
comment
Кстати, заголовок вашего вопроса может немного вводить в заблуждение, поскольку вы просите помощи в построении XIB/View Controller, а не в анимации.   -  person makdad    schedule 11.04.2011
comment
Спасибо за ваш комментарий. Изменил заголовок. Это лучше?   -  person martin's    schedule 11.04.2011


Ответы (2)


Кажется, ваш вопрос касается владения, а не анимации. Попробуйте изолировать символ в его собственный xib (скажем, Character.xib) и создать класс CharacterLoader. Класс CharacterLoader будет иметь свойство character и выглядеть примерно так:

CharacterLoader.h

@interface CharacterLoader : NSObject {
}

@property(nonatomic, retain) IBOutlet Character *character;

+ (Character *)loadCharacter;

@end

CharacterLoader.m

...

+ (Character *)loadCharacter {
    CharacterLoader *loader = [[CharacterLoader alloc] init];
    [[NSBundle mainBundle] loadNibNamed:@"Character" owner:loader options:nil];
    Character *character = [loader.character autorelease];
    [loader release];
    return character;
 }

 ...

Если вы обнаружите, что делаете много этих классов загрузчика, вы можете объединить их в один класс, роль которого в основном состоит в том, чтобы программно загружать перья, подобные этому. Другой альтернативой было бы просто создать Character и весь другой общий контент программно, но это, вероятно, нежелательно для вас, поскольку вы намеренно приближаетесь к нему с помощью перьев.

person Damian Carrillo    schedule 11.04.2011
comment
Интересный. Не думал об этом. На самом деле я играл со второй идеей, которую вы предложили, с программным созданием персонажа. Таким образом, создание множества UIImageView и управление ими не так уж и сложно. Так что, да, мне действительно не нужен отдельный xib, если я пойду по этому пути, что может быть хорошей идеей. - person martin's; 11.04.2011

В интересах закрытия цикла вот что я сделал:

Я создал подкласс UIViewController с файлом пера. Назвал его «Анимированный персонаж».

«AnimatedCharacter.xib» состоит из всех элементов, необходимых для создания персонажа. Он имеет ряд элементов управления, подключенных к IBOutlets и IBActions, управляемых из «AnimatedCharacter.m». В моем случае «AnimatedCharacter.m» создает NSTimer, который запускает конечный автомат через равные промежутки времени, чтобы решить, что делать с персонажем. Он также реализует воспроизведение звука стандартными средствами.

Кроме этого в этих файлах/коде нет ничего особенного. Другими словами, я не делал ничего экстраординарного, чтобы подготовить их к вставке в другой UIViewController.

В файле .h контроллера основного представления:

#import "AnimatedCharacter.h"

...

AnimatedCharacter *character;

...

@property (nonatomic, retain) AnimatedCharacter *character;

Затем в файле .m контроллера основного вида:

@synthesize character;

...

- (void)viewDidLoad 
{
character = [[AnimatedCharacter alloc] init];
character.view.frame = CGRectMake(54.0, 0.0, 150.0, 150.0);
[self.view addSubview:character.view];

...

Имея это на месте, теперь я могу делать такие вещи, как:

-(void)FadeOut:(SEL)selector
{
[UIView beginAnimations:@"resize" context:NULL];

    [UIView setAnimationDuration:0.5];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:selector];

    character.view.frame    = CGRectMake(0.0, 0.0, 50.0, 50.0);

[UIView commitAnimations];
}

И, как правило, управляйте персонажем, как я считаю нужным, с помощью различных функций-членов в «AnimatedCharacter.m». Это эффективно работает как перо внутри пера. Не отдельные потоки, но оба пера выполняют свои обязанности, как и ожидалось, получают входные данные и запускают соответствующие шоу.

Я был бы заинтересован в комментариях относительно хороших/плохих/некрасивых аспектов того, что я решил сделать.

person martin's    schedule 14.04.2011