同时动画两个UIViews(粘在一起)

时间:2013-02-10 16:45:44

标签: ios objective-c cocoa-touch animation uiview

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

我有一个名为SubView的类,这个类有一个简单的能力,它可以显示或消除动画

它是这样的:

-(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存储了View的位置的原始值,如果真的相似则隐藏部分

-(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 = _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;
    }
}];

如果子视图显示为像动画一样推送

,则父视图向右移动

这是需要理解的所有代码(这是我的第一个问题,所以请原谅这里的任何漫步)

重点是动画不会同时出现, 会发生什么是进入的视图比父视图慢一点 他们不会粘在一起,我真的不知道该怎么做......

顺便说一句:他们确实在动画第一次出现时粘在了一起,但是之后就没有了......

有什么建议吗?

修改 我现在给出一些图片来解释会发生什么

screenshot 1 screenshot 2

1 个答案:

答案 0 :(得分:1)

我把它当作答案实际上没有达到......

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

MAPVIEW大小为100%,而tableview大小为80%......我正在将它们放在相同的动画上......所以它们的移动方式不同,因为它们必须覆盖1.0秒左右的整个动画动画。

这个问题通过做一个明显的动画来修复......那里有一些图书馆......我用了一个破坏了我的项目...所以我最后抛弃了它...并且采取了更多......补丁解决方案...将背景颜色设置为掩盖运动......

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

我希望这个"解决方案"帮助社区..