Ios UIView具有自动布局和约束的动画问题

Ios UIView具有自动布局和约束的动画问题,ios,objective-c,uiview,uiviewanimation,nslayoutconstraint,Ios,Objective C,Uiview,Uiviewanimation,Nslayoutconstraint,我正在开发一个应用程序,它有一个功能,允许用户从他们的照片库中选择一幅图像,并在上面附加一个标题,以便在UICollectionView中显示。我正在使用故事板和自动布局。我有一个UIView(嵌入在导航控制器中),其中包含一个基本文本字段,供用户输入标题,一个初始化图像选择器控制器的按钮,以及一个小的UIView子视图,其中包含选定图像的缩略图和一个小的“X”按钮,供用户决定更改其选择时使用。当用户做出选择时,我需要一个动画来隐藏“选择图像”按钮,并将保存图像缩略图的UIView向上移动到其位

我正在开发一个应用程序,它有一个功能,允许用户从他们的照片库中选择一幅图像,并在上面附加一个标题,以便在UICollectionView中显示。我正在使用故事板和自动布局。我有一个UIView(嵌入在导航控制器中),其中包含一个基本文本字段,供用户输入标题,一个初始化图像选择器控制器的按钮,以及一个小的UIView子视图,其中包含选定图像的缩略图和一个小的“X”按钮,供用户决定更改其选择时使用。

当用户做出选择时,我需要一个动画来隐藏“选择图像”按钮,并将保存图像缩略图的UIView向上移动到其位置。如果点击缩略图角上的“X”按钮,UIView将向下移动,“选择图像”按钮将重新出现

我的问题是,当用户取消选择时,我可以让动画工作,但当他们进行了选择并从图像选择器控制器返回时,我无法让动画工作;视图根本不移动,但为了测试动画代码,我将“选择图像”按钮的alpha设置为0.0,这样动画就正确了

下面是一些代码:

// MyController.m

// When user hits the 'select image' button
- (void)selectImage
{   
    self.imagePicker = [[UIImagePickerController alloc] init];
    self.imagePicker.delegate = self;
    [self.imagePicker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
    [self presentViewController:self.imagePicker animated:YES completion:nil];
}

// When user has selected an image from photo library
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    // Grab photo selection..

    [self dismissViewControllerAnimated:YES completion:nil];    
    [self imageSelectionMade];
}

// Animation to hide button and move thumbnail up
- (void)imageSelectionMade
{
    CGRect rect = self.thumbView.frame;

    [UIView animateWithDuration:0.3 delay:1.0 options:UIViewAnimationOptionCurveLinear animations:^{
        self.buttonView.alpha = 0;
        self.thumbView.frame = CGRectMake(rect.origin.x, (rect.origin.y - 76), rect.size.width, rect.size.height);
    }completion:nil];
    // Show 'X' button on corner of image
}

// Animation to move thumbnail down and display button again
- (void)imageSelectionCancelled
{
    CGRect rect = self.thumbView.frame;
    [UIView animateWithDuration:0.3 animations:^{
        self.buttonView.alpha = 1.0;
        self.thumbView.frame = CGRectMake(rect.origin.x, (rect.origin.y + 76), rect.size.width, rect.size.height);
    }];
    // Change image to 'placeholder' and hide 'X' button..
}
我在这里读过很多关于类似问题的帖子,但似乎没有一篇能够解决这个问题。我尝试过操纵视图的约束,而不是视图的框架,这只会导致它在两个实例中“捕捉”到位。我尝试了
[self.view layoutifneed]
,但没有效果。我试着在图像选择器出现之前为第一个动画编写代码,图像选择器可以正常工作,但显然会被进入视图的选择器覆盖。我不敢说,除了禁用autolayout之外,我不知道还有什么可以尝试的(鉴于我有限的经验和我不知道它将如何影响应用程序的其余部分,我对禁用autolayout不太自信)

有人知道这是什么原因吗?我只能猜测它与子视图的约束有关,但为什么它在我的
imageSelectionCancelled
方法中工作


注意:我使用的是Xcode 4.6

我不确定您的描述是否完全表达了这个问题,但我会采用一种基本做法,即在开始新的动画之前取消任何动画。在这种情况下,在开始动画之前,我会在imageSelectionCancelled和ImageSelectionMake中添加这些行。:[self.buttonView.layer RemoveAllianimations];[self.thumbView.layer removeAllAnimations];感谢@TalYaniv,在我第一次选择图像时仍然没有动画,但是如果我取消选择并再次拾取,每次都会显示出完美的效果,直到我返回到集合视图,在这种情况下,该过程会重复。您是否建议我在我的帖子中添加一些内容来更好地描述这个问题?我认为您引用的代码不完整,也没有经过测试。它实际上包含一个未注释的行(“抓取照片选择…”)。另外,我不确定您是否真的打算在imagePickerController:didFinishPickingMediaWithInfo:中拾取图像时关闭整个视图控制器。也许这让我感到困惑。@TalYaniv,代码肯定已经过测试了。”Grab photo selection'表示处理选择器返回的图像的代码-这几行代码与问题无关,因此我添加了注释,只是忘记了注释这一行(现已修复)。至于
dismissViewControllerAnimated:completion:
,它会解除
UIImagePickerViewController
,所以是的,我是认真的。一旦用户做出了选择,我不明白为什么我不会拒绝它?