Ios 同时设置两个UIView的动画(粘在一起)

Ios 同时设置两个UIView的动画(粘在一起),ios,objective-c,cocoa-touch,animation,uiview,Ios,Objective C,Cocoa Touch,Animation,Uiview,我在这里搜索了很多,但似乎找不到我问题的答案 我有一个叫做子视图的类,这个类有一个简单的功能,它可以显示或消失动画 它是这样做的: -(void)showAnimated:(BOOL)animated { self.active = YES; //Make topmost [self.parentView bringSubviewToFront:self]; if (animated) { [UIView animateWithDuration:0.5

我在这里搜索了很多,但似乎找不到我问题的答案

我有一个叫做子视图的类,这个类有一个简单的功能,它可以显示或消失动画

它是这样做的:

-(void)showAnimated:(BOOL)animated {

self.active = YES;

//Make topmost
[self.parentView bringSubviewToFront:self];

if (animated) {

    [UIView animateWithDuration:0.5
                          delay:0.0f
                        options:UIViewAnimationCurveEaseInOut | UIViewAnimationOptionBeginFromCurrentState
                     animations:^{
                         self.frame = self.originalFrame;
                         if (self.panningBlock) {
                             self.panningBlock(self.contentView.frame);
                         }
                     }
                     completion:^(BOOL finished){
                     }];

}

else {
    self.frame = self.originalFrame;
    if (self.panningBlock) {
        self.panningBlock(self.contentView.frame);
    }
}
如果self.originalFrame存储了视图位置的原始值,则隐藏部分(如果非常相似)

-(void)hideAnimated:(BOOL)animated {

self.active = NO;

//Store the frame
CGRect _frame = self.frame;

//Set the view starting point
switch (self.showingLocation) {
    case SubViewShowingLocationRight:
        _frame.origin = CGPointMake(_frame.size.width, _frame.origin.y);
        break;
    case SubViewShowingLocationBottom:
        _frame.origin = CGPointMake(_frame.origin.x, _frame.size.height);
        break;
    case SubViewShowingLocationLeft:
        _frame.origin = CGPointMake(-_frame.size.width, _frame.origin.y);
        break;

    default:
        break;
}


if (animated) {
    [UIView animateWithDuration:0.5
                          delay:0.0f
                        options:UIViewAnimationCurveEaseInOut | UIViewAnimationOptionBeginFromCurrentState
                     animations:^{
                         self.frame = _frame;
                         if (self.panningBlock) {
                             self.panningBlock(self.contentView.frame);
                         }
                     }
                     completion:^(BOOL finished){
                     }];

}
else {
    self.frame = _frame;
    if (self.panningBlock) {
        self.panningBlock(self.frame);
    }
}

[self.delegate didDismissSubView:self];
}

//// 因此,动画发生在self.frame=\u frame和self.frame=self.originalFrame

我还有self.panningBlock,这是一个父视图可以提供的块(它可以根据子视图的帧变化调整自己。例如,子视图有一个选择器,它从底部显示,我需要调整表视图,使其不被选择器遮挡)

我所做的一个例子是

__weak MapViewController * weakSelf = self;
[weakSelf.placesView setPanningBlock:^(CGRect _frame){

    if (weakSelf.placesView.isActive) {
        CGRect mapFrame = weakSelf.mapView.frame;
        mapFrame.origin.x = _frame.origin.x + _frame.size.width;
        weakSelf.mapView.frame = mapFrame;
    }
    else {
        CGRect mapFrame = weakSelf.mapView.frame;
        mapFrame.origin.x = 0;
        weakSelf.mapView.frame = mapFrame;
    }
}];
在这里,如果子视图显示为推式动画,则父视图将向右移动

这就是所有需要理解的代码(这是我的第一个问题,请原谅这里的漫无边际)

关键是动画不会同时出现, 发生的情况是,正在进入的视图比父视图进入的速度稍慢 他们不在一起,我真的不知道该怎么办

顺便说一句:动画第一次出现时,它们确实粘在一起,但之后就不再粘在一起了

有什么建议吗

编辑 我现在给出一些图片来解释发生了什么


我之所以这样说,是因为实际上还没有找到答案

这里的问题是。。视图的总大小

MAPVIEW大小为100%,而tableview大小为80%。。。我把它们放在同一个动画上。。。因此,它们的移动方式会有所不同,因为它们必须在整个移动中覆盖1.0秒左右的动画

通过执行显式动画解决了此问题。。。外面有一些图书馆。。。我用了一个破坏了我的项目。。。所以我最终放弃了它。。。并采取了更多的。。。修补程序解决方案。。。放置背景色,使其遮罩运动

这个问题的解决方案是使用一个显式动画,并为每一帧。。。将两个视图移动到同一点


我希望这个“解决方案”能帮助社区。

请原谅隐藏方法的其他部分。。。它发送self.frame而不是self.contentView.frame…它实际上没有影响,因为我总是发送动画(我现在将更改它),很难理解您的所有视图是什么。你能描述一下你有什么样的观点,以及你希望他们如何移动吗?您提到了子视图类、选择器和表——不清楚它们是如何协同工作的(或者它们是否都包含在同一个superview中)。。。在这里,子视图类只是一个能够从侧面隐藏或显示的视图,show和hide方法可以做到这一点,使原点向左、向右或向下消失,或恢复其原始帧以显示,然后self.panning块是子视图调用的可选块,因此此视图的父视图,可以根据显示或消失的视图调整自身(即,视图从左侧显示,我希望父视图将自身移动到右侧为其腾出空间(如推送)…内容视图包含子视图的内容谢谢!平移块是..当子视图隐藏或显示时,调用者会做什么(调整等)…contentView具有实际的内容(表视图等),而普通视图是清晰的…(这是由于我必须维护的旧方法)^^…我差点忘了…在最后一行代码中…MapViewController=>是具有包含子视图的视图的控制器…而weakSelf.placesView是子视图…因此我检查子视图是否显示(活动)然后移动给它空间…如果不是,我将原点设置为0以使用所有屏幕:D我忘了解释,我没有看到任何会导致第一次工作的东西,以后也不会。我想我需要查看整个代码,以便对如何操作提出任何建议——我很难在没有看到的情况下绞尽脑汁把它付诸行动。