今天,我试图在取消后获得一个返回默认原点的视图。我正在使用两个VC来做到这一点。一个是tableview中的页脚控制器,另一个是模态视图,在第一个动画之后显示。每当我尝试从模态视图返回时,在我完成第一个动画后,原点仍然是相同的。这是我正在使用的代码:
Footer:
-(IBAction)addPerson:(id)sender{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.25];
NSLog(@"%f", self.view.frame.origin.y);
self.view.frame = CGRectMake(0,-368,320,400);
[UIView commitAnimations];
self.tdModal2 = [[TDSemiModalViewController2 alloc]init];
// [self.view addSubview:test.view];
[self presentSemiModalViewController2:self.tdModal2];
}
-(void)moveBack{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.25];
NSLog(@"%f", self.view.frame.origin.y);
self.view.frame = CGRectMake(0,368,320,400);
[UIView commitAnimations];
}
在模态视图中:
-(IBAction)cancel:(id)sender{
[self dismissSemiModalViewController:self];
FooterViewController *foot = [[FooterViewController alloc]init];
self.footer = foot;
// self.footer.view.frame = CGRectMake(0,35,320,400);
[self.footer moveBack];
}
答案 0 :(得分:1)
我提出以下建议,它们可能对你有好处。
注1,AffineTransform
如果翻译总是在同一点并始终使用相同的度量,我建议使用CGAffineTransformMakeTranslation(<#CGFloat tx#>, <#CGFloat ty#>)
而不是修改视图的帧。此方法指定视图移动的x和y点数。
这样,将视图返回到原始位置就像执行view.transform = CGAffineTransformIdentity.
当然,这两个都在他们各自的动画块中。
注2,使用CGPoint移动原点
如果您只是移动视图的原点,那么建议:
CGRect hiddenFrame = self.view.frame;
hiddenFrame.origin.y -= 736;
self.view.frame = hiddenFrame;
或
CGRect hiddenFrame = self.view.frame;
hiddenFrame.origin.y = -368;
self.view.frame = hiddenFrame;
或
CGRect hiddenFrame = self.view.frame;
hiddenFrame.origin = CGPointMake(0,-368);
self.view.frame = hiddenFrame;
同样的回归。这是更多的代码,但它更容易理解。
注3,UIView动画块
你应该使用新的块:
[UIView animateWithDuration: 0.25 animations: ^(void) {
//animation block
}];
还有其他方法有更多方法作为延迟,完成块等。
选项,委托或引用传递
创建模态控制器时,传递当前控制器的引用:
self.tdModal2 = [[TDSemiModalViewController2 alloc]init];
self.tdModal2.delegate = self;
您应该在 TDSemiModalViewController2.h 中声明该属性。通过宣布@class FooterViewController
来避免交叉进口;通过制定协议并将属性声明为id<myModalProtocol>
, FooterViewController 然后应该使用方法moveBack
实现协议;或者只是将该属性声明为 id 并调用[self.delegate performSelector: @selector(moveBack)]
。
然后在取消方法中,只需执行:
[self dismissSemiModalViewController:self];
[self.delegate moveBack] //or performSelector.. in the third option case