0

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

我有一个叫 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;
    }
}];

如果子视图看起来像动画一样推送,则父视图向右移动

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

关键是动画不会同时发生,发生的情况是进入的视图比它们不粘在一起的父视图慢一点,我真的不知道该怎么办...

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

有什么建议么?

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

截图 1 截图 2

4

1 回答 1

1

我把这个作为答案实际上没有达到......

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

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

这个问题是通过做一个显式动画来解决的......那里有一些库......我使用了一个破坏了我的项目的库......所以我最终放弃了它......并采取了更多......补丁解决方案。 ..设置背景颜色,使其掩盖运动...

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

我希望这个“解决方案”对社区有所帮助..

于 2013-03-21T01:00:16.133 回答