Анимация UIView на прикосновенияхЗакрытое событие - PullRequest
1 голос
/ 27 февраля 2012

Я пытаюсь анимировать UIView (блочная анимация), но не могу заставить работать время (продолжительность и т. Д.). Анимация запускается, потому что изменения сделаны, и выводится сообщение о завершении, но оно просто игнорирует продолжительность и мгновенно вносит изменения.

Я полагаю, что с тем, как я что-то делаю, что-то не так, но я просто не могу понять, в чем ошибка. Позвольте мне объяснить, что я пытаюсь сделать:

У меня есть UIViewController (viewcontroller), который обрабатывает два объекта (view1 и view2) из ​​подкласса UIView, в котором я определил метод touchesEnded.

Идея состоит в том, что, когда view1 был затронут, я хочу анимировать view2. Поэтому я реализовал метод анимации в подклассе UIView, уведомление в методе touchesEnded (также в подклассе UIView) и метод триггера в контроллере, который вызывает анимацию второго представления. Примерно так:

// In the UIView subclass:
- (void) myAnimation{
    [UIView animateWithDuration:2.0
        delay:0.0
        options: UIViewAnimationCurveEaseOut
        animations:^{
            self.alpha = 0.5;
        } 
        completion:^(BOOL finished){
            NSLog(@"Done!");
        }];
}

// In the UIView subclass:
- (void) touchesEnded: (NSSet*) touches withEvent: (UIEvent*) event {
        [pParent viewHasBeenTouched];   // pParent is a reference to the controller
}

// In the UIViewController:
- (void) viewHasBeenTouched {
    [view2 myAnimation];
}

(анимация и рабочий процесс на самом деле немного сложнее, но этот простой пример просто не работает)

Если я размещу анимацию где-то еще, она может работать, например, сразу после инициализации представлений в методе init контроллера. Но если я попытаюсь сделать это вызовы вперед-назад, анимация просто проигнорирует продолжительность и выполнится за один шаг.

Есть идеи? Что я упустил из-за прикосновений и жестов, которые я должен знать? Спасибо.

НОВАЯ ИНФОРМАЦИЯ, ДОБАВЛЕННАЯ К ОРИГИНАЛЬНОМУ ПОЧТУ:

AppDelegate ничего не делает, кроме этого:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.viewController = [[TestViewController alloc] init];
    self.window.rootViewController = self.viewController;
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

TestViewControler.h это просто:

#import <UIKit/UIKit.h>
#import "TestView.h"

@interface TestViewController : UIViewController{
    TestView* myView;
}

- (void) viewHasBeenTouched;

@end

и viewDidLoad делает только это:

- (void)viewDidLoad{
    [super viewDidLoad];
    myView = [[TestView alloc] initWithParent:self];
    [self.view addSubview:myView]; 
}

Наконец, в UIView есть TestView.h, который выглядит следующим образом:

#import <UIKit/UIKit.h>

@class TestViewController; // Forward declaration
@interface TestView : UIView{
    TestViewController* pParent;
}

- (id)initWithParent:(TestViewController*) parent;
- (void) myAnimation;

@end

И используемый метод init:

- (id)initWithParent:(TestViewController *)parent{
    CGRect frame = CGRectMake(50, 20, 100, 200);
    self = [super initWithFrame:frame];
    if (self) pParent = parent;
    self.backgroundColor = [UIColor blueColor];
    return self;
}

Итак ... с этим простым кодом, который я разместил, возникает ошибка. Как я уже сказал, анимация меняет альфу, но без задержки и синхронизации. Это просто мгновенно. Любые идеи с этой добавленной информацией?

Еще раз спасибо за помощь.

1 Ответ

1 голос
/ 03 марта 2012

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

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

- (BOOL)shouldAutorotateToInterfaceOrientation (UIInterfaceOrientation)interfaceOrientation {
    // ... More code
    [UIView setAnimationsEnabled:NO];
    // ... More code
    return YES;
}

Это, очевидно, не нуждается в дополнительном объяснении.

Еще раз большое спасибо за ваше время, и мои искренние извинения.

...