将原点移回原位

时间:2014-04-07 17:41:58

标签: ios iphone objective-c uiview ibaction

今天,我试图在取消后获得一个返回默认原点的视图。我正在使用两个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];

}

1 个答案:

答案 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