gpt4 book ai didi

ios - 在 touchesEnded 事件上为 UIView 设置动画

转载 作者:行者123 更新时间:2023-11-29 13:39:49 25 4
gpt4 key购买 nike

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

我假设我做事的方式有问题,但我就是想不出错误在哪里。让我解释一下我要做什么:

我有一个 UIViewController (viewcontroller),它处理 UIView 子类的两个对象(view1 和 view2),我在其中定义了 touchesEnded 方法。

想法是当 view1 被触摸时,我想为 view2 设置动画。所以我所做的是在UIView子类中实现一个动画方法,在touchesEnded方法中实现一个通知(也在UIView子类中),和 Controller 中的触发方法将调用第二个 View 的动画。像这样:

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

(动画和工作流程其实有点复杂,但是这个简单的例子就是不行)

如果我将动画放在其他地方,它可能会起作用,例如在 Controller 的 init 方法中初始化 View 之后。但是如果我尝试进行这种前后调用,动画将忽略持续时间并一步执行。

有什么想法吗?关于我应该知道的触摸和手势,我错过了什么?谢谢。

添加到原始帖子的新信息:

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

显然不需要进一步解释。

再次非常感谢您抽出宝贵时间,并向您致以诚挚的歉意。

关于ios - 在 touchesEnded 事件上为 UIView 设置动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9462805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com