我在这里搜索了很多,但似乎找不到我的问题的答案......
我有一个叫 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;
}
}];
如果子视图看起来像动画一样推送,则父视图向右移动
这就是需要理解的所有代码(这是我的第一个问题,所以请原谅这里的任何漫无边际)
关键是动画不会同时发生,发生的情况是进入的视图比它们不粘在一起的父视图慢一点,我真的不知道该怎么办...
顺便说一句:动画第一次出现时它们确实粘在一起,但之后就没有了……
有什么建议么?
编辑 我现在给出一些图像来解释发生了什么