UIView动画不起作用

时间:2014-12-08 04:52:09

标签: ios objective-c animation uiview

我的代码中某些东西禁用了动画,我找不到它。我在我的应用程序中构建了一个搜索栏,它有一个委托调用开始和结束编辑。当它开始时,我有一个动画块来改变它的大小,它可以工作,但它结束时的动画却没有。除了动画和委托调用之外,我已经注释掉了每行代码,甚至设置了动画块的延迟,并且它总是立即设置,但是与对象的交互会延迟动画的时间量。是否有理由禁用动画或找出动画为何跳过的一般方法?

编辑:即使禁用代理的所有代码并且有延迟的动画块也无效,按下按钮并调用

- (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秒钟,这里是视频和代码。

视频:http://cl.ly/3x3k3H2m1Y2F

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: 我真正想做的事情:我正在开发的应用程序是一个Web浏览器。我构建了一个自定义搜索栏视图。视图位于UIBarButtonItem中,该​​UIBarButtonItem位于连接到屏幕顶部的UIToolbar中。当用户点击条形项目时,文本字段变为活动状态并且键盘显示,内部视图的框架被动画缩小并出现取消按钮(仍然是此搜索栏UIView子类的一部分)。当点击取消按钮时,它会调用子类中的一个方法,然后进行一些清理,然后将其委托方法调用到我的UIViewController,然后再对该帧进行动画处理以使其变大。我需要更改框架的原因是因为如果文本字段太小,我需要在编辑时使其更大,但是在编辑完成后可以使其更小。

问题:当文本字段变为活动状态时,将在动画块内更改帧。帧在给定的时间和新的设置帧上正确地设置动画。当点击取消按钮时,会调用另一个动画块来再次更改帧,但无论此动画块是在委托方法中还是在UIView子类中,或者我尝试动画的任何内容, NOT 动画。如果我在动画块上添加延迟,它仍然会像在动画块之外调用代码一样,尽管在正确的时间调用完成块,如果我将动画块放在可以延迟的块中它将被正确延迟的代码,但动画仍然没有发生。在动画时间完成之前,点击也不会影响视图,就像正常一样。

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

编辑8:我已经弄明白了这个问题。 这一直是一种视错觉。即使在动画块内设置UIBarButtonItem的宽度,周围的条形项也会自动分隔到新帧。即使框架真的是动画,子视图也会自动在正确的位置,但动画的顺序使它看起来像是真正动画正确的一切。我在编辑完成时尝试做的动画更加明显,所以我认为只是那不是动画。改变一些东西使它看起来更好但我不认为它可以让条形按钮项目以我想要的方式动画。

3 个答案:

答案 0 :(得分:0)

<强>修

如果您尝试在以编程方式诱导的搜索栏被取消时提交动画,那么这样的事情就可以解决问题:

@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.
}

这是你可能出错的地方:

当取消搜索栏时,您必须使用方法searchBarCancelButtonClicked:invoked:

-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
[self animateButton];
}

-(void)animateButton {
//Commit your animations here:
}

答案 1 :(得分:0)

试试这个

[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];

答案 2 :(得分:0)

你有没有写[UIView setAnimationsEnabled:NO]; 检查你的代码。有时它会导致UIView动画出现问题。