Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIView动画不工作_Ios_Objective C_Animation_Uiview - Fatal编程技术网

Ios UIView动画不工作

Ios UIView动画不工作,ios,objective-c,animation,uiview,Ios,Objective C,Animation,Uiview,不知何故,我的代码中有些东西禁用了动画,我找不到它。我在我的应用程序中建立了一个搜索栏,它有一个用于开始和结束编辑的代理调用。当它开始时,我有一个动画块来改变它的大小,它可以工作,但当它结束时,动画却不能。我已经注释掉了除动画和代理调用之外的每一行代码,甚至在动画块上设置了延迟,并且总是立即设置,但是与对象的交互延迟了动画的时间。是否有禁用动画的原因,或者有一种通用的方法来确定动画跳过的原因 编辑:即使禁用代理的所有代码并使动画块延迟也不起作用,按钮也会被点击并调用 - (void)cancel

不知何故,我的代码中有些东西禁用了动画,我找不到它。我在我的应用程序中建立了一个搜索栏,它有一个用于开始和结束编辑的代理调用。当它开始时,我有一个动画块来改变它的大小,它可以工作,但当它结束时,动画却不能。我已经注释掉了除动画和代理调用之外的每一行代码,甚至在动画块上设置了延迟,并且总是立即设置,但是与对象的交互延迟了动画的时间。是否有禁用动画的原因,或者有一种通用的方法来确定动画跳过的原因

编辑:即使禁用代理的所有代码并使动画块延迟也不起作用,按钮也会被点击并调用

- (void)cancelButtonPressed:(id)sender {
    [UIView animateWithDuration:5.0f delay:5.0f options:0 animations:^{
        self.layer.borderWidth = 1.0f;
        self.layer.borderColor = [UIColor redColor].CGColor;

    } completion:^(BOOL finished) {

    }];
}
这会立即发生,甚至不会延迟5秒

编辑2:我将动画代码放在另一个块中,该块可以在延迟后执行代码,代码确实正确延迟,但动画仍然不工作

编辑3:下面是调用cancelButtonPressed方法的按钮的代码

cancelButton = [UIButton buttonWithType:UIButtonTypeSystem];
            [cancelButton setTitle:NSLocalizedString(@"Cancel", @"Cancel") forState:UIControlStateNormal];
            cancelButton.translatesAutoresizingMaskIntoConstraints = NO;
            [cancelButton addTarget:self action:@selector(cancelButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
            [self addSubview:cancelButton];
编辑4: 这里是一个动画问题的视频。当我单击“取消”按钮时,它会立即缩小,但代码位于动画块中,预计需要5秒钟,下面是视频和代码

视频:

barItem是一个UIBarButton项,它的customView是我的搜索栏UIView子类

[UIView animateWithDuration:5.0f animations:^{
                barItem.width = 200;
                CGRect addressBarFrame = barItem.customView.frame;
                addressBarFrame.size.width = 200;
                barItem.customView.frame = addressBarFrame;
            } completion:^(BOOL finished) {
                NSLog(@"COMPLETION!");
            }];
编辑5: 我真正想做的是:我正在开发的应用程序是一个网络浏览器。我构建了一个自定义搜索栏视图。视图位于UIBarButtonim中,该UIBarButtonim位于连接到屏幕顶部的UIToolbar内。当用户点击条形图项目内部时,文本字段变为活动状态,键盘显示,内部视图的框架被设置为收缩动画,并且“取消”按钮仍然显示在此搜索栏UIView子类中。当点击cancel按钮时,它调用子类中的一个方法,并进行一些清理,然后将其委托方法调用到我的UIViewController,然后它将再次设置帧的动画以使其变大。我需要更改框架的原因是,如果文本字段太小,我需要在编辑时将其变大,但在编辑完成后可以将其变小

问题:当文本字段处于活动状态时,帧在动画块内发生更改。该帧在给定的时间内正确设置动画,并设置到新的设置帧。当点击“取消”按钮时,会调用另一个动画块来再次更改帧,但无论该动画块是在委托方法中还是在UIView子类中,或者我尝试设置动画的任何对象中,都不会设置动画。如果我在动画块上添加延迟,它仍然会像在动画块外调用代码一样工作,尽管在正确的时间调用完成块,如果我将动画块放在可以延迟代码的块内,它将正确延迟,但动画仍然不会发生。点击也不会影响视图,直到动画时间完成,就像正常一样

编辑7:如果我为cancelButtons帧或背景色设置动画,它将起作用。所以我想它所在的工具栏可能有问题,但是设置背景色的动画也可以。因此,我仍然不知道为什么我可以在编辑之前在上面的代码中为条形项目和自定义视图的框架设置动画,但在编辑之后无法为其设置动画

编辑8:我已经解决了这个问题。 这一直是一种视错觉。即使在动画块内设置uiBarButtonim的宽度,周围的条项目也会自动分隔到新帧。即使帧真的在制作动画,子视图也会自动处于正确的位置,但是动画的顺序使它看起来像是在正确地制作所有东西的动画。当编辑完成时,我试图做的动画更引人注目,所以我认为那不是动画。改变一些东西使它看起来更好,但我不认为它可能有酒吧按钮项目,以动画的方式我想要的

修订

如果您试图在程序诱导的搜索栏被取消时提交动画,那么类似这样的操作将起到作用:

@interface TableViewController : UITableViewController <UISearchBarDelegate>

@property (strong, nonatomic) UISearchBar *searchBar;

@end

- (void) viewDidLoad:(BOOL)animated {

UIView *searchbarView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 40, 44)]; //This adds a container that will hold the search bar. 
self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 40, 44)]; 
self.searchBar.showsCancelButton = YES;
[searchbarView addSubview:self.searchBar];
self.searchBar.delegate = self;
[self.view addSubview:searchbarView]; or add to whatever view you want.
}
试试这个

[UIView animateWithDuration:5.0 animations:^{
        CGRect addressBarFrame = barItem.customView.frame;
        addressBarFrame.size.width = 200;
        barItem.customView.frame = addressBarFrame;
    } completion:^(BOOL finished) {
        NSLog(@"COMPLETION!");
    }];
还是这个

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:5.0];
CGRect addressBarFrame = barItem.customView.frame;
addressBarFrame.size.width = 200;
barItem.customView.frame = addressBarFrame;
[UIView commitAnimations];
您是否编写了[UIView SetAnimationEnabled:否];
签入代码。有时,它会给UIView动画带来问题。

您是否可以尝试在完成的块中放置一些NSLog,然后查看它何时被打印或是否被打印。它可能会让我们了解实际发生的情况。这里的图层是什么?我不确定“0”是否是选项参数的有效值。这可能会导致一些奇怪的行为。请参考UIView类引用并使用有效值,如UIViewAnimationOptionCurveEaseInOut。此外,如果没有任何完成块,则可以简单地将NULL用于此参数
. 再次,请参阅UIView类引用。@Yogi在正确的时间,在5秒后调用完成。@sanjeet此代码位于我的UIView子类中,它是一个搜索栏。self是一个搜索栏视图。我以图层为例,但真正的目标是设置其宽度的动画,但问题发生在每件事上。我想要设置动画的任何东西都不会设置动画,无论它是在子类本身中还是在视图控制器中。这是最奇怪的事情。@Maximilian当按下UISearchBar取消按钮时,您是否试图提交动画?它不是UISearchBar,是自定义的,但是的。当点击取消按钮时,我想做一个动画。好的。我会为你修改我的答案这里有一个关于这个问题的视频,点击“取消”后的动画时间是5秒,虽然你可以看到它的瞬间,但是点击在5秒内被禁用。我无法观看视频,但为了快速回顾,我认为您在对动画代码进行排序时犯了错误。两者都不起作用,会立即再次发生。由于必须设置barItem.width以及自定义图幅,因此也无法正常工作,但即使使用此代码设置宽度,也无法正常工作:[太奇怪了。你能分享屏幕截图吗?屏幕截图不会显示我的问题,但这里有一段视频。当我点击“内部”以增加大小时,动画速度很快,就像应该的那样,但当我点击“取消”时,动画速度很快。虽然我刚刚发现这不是视图问题,但从类内部更改背景的动画似乎很快现在正在工作,因此某些东西正在影响工具栏和工具栏按钮项:/
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:5.0];
CGRect addressBarFrame = barItem.customView.frame;
addressBarFrame.size.width = 200;
barItem.customView.frame = addressBarFrame;
[UIView commitAnimations];