Как приблизиться к общей XIB или элементам управления на нескольких контроллерах представления? - PullRequest
1 голос
/ 11 апреля 2011

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 11 апреля 2011

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

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;
 }

 ...

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

1 голос
/ 14 апреля 2011

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

Я создал подкласс UIViewController с файлом пера. Называется "AnimatedCharacter".

«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". Это эффективно работает как кончик внутри кончика. Не отдельные потоки, но оба пера выполняют свои обязанности, как и ожидалось, получают входные данные и запускают свои соответствующие шоу.

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

...