我正在尝试为UIView(基于块的动画)制作动画,但无法使计时工作(持续时间等)。动画会运行,因为更改已完成,并且显示了完成输出消息,但它只是忽略了持续时间并立即进行了更改。

我认为我做事的方式有问题,但是我无法弄清楚错误在哪里。让我解释一下我要做什么:

我有一个UIViewController(视图控制器),它处理UIView子对象的两个对象(view1和view2),在其中定义了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;
}


所以...用我发布的这个简单代码,就会发生错误。就像我说的那样,动画确实会更改Alpha,但是没有延迟或定时。只是瞬间而已。关于此附加信息有什么想法吗?

再次感谢您的帮助。

最佳答案

我发现了问题。我要首先向所有人道歉,他们是如何研究我的问题的,并为此付出了宝贵的时间。

我在原始问题中发布的所有第二部分实际上都是复制并粘贴的,这是第一部分中存在这两个不匹配的错误,因为它们来自更复杂的代码。正如您所说的那样,该代码可以正常工作。问题是我没有复制并粘贴我认为已从项目中删除的方法(该方法在应用程序的开头被调用):

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


显然不需要进一步解释。

再次非常感谢您的宝贵时间,我深表歉意。

08-18 12:37
查看更多