2012-02-01 53 views
1

这是一个奇怪的问题。我有创造与需要动画,以免键盘时,将显示一些文本字段创建新用户的iPhone视图控制器,即认为动画上下保持键盘的顶部和下部边缘之间的最小间隙文本字段。当它从登录现有用户屏幕(故事板中的初始视图控制器)以模态方式呈现时,工作正常。self.view.frame不再当动画故事板中的初始视图控制器

于是我决定改变应用一下,让登录/创建用户意见将属于同一个视图控制器。他们过渡如此:

if(accountCreateView == nil) { 
    UINib *nib = [UINib nibWithNibName:@"NewAccountView" bundle:nil]; 
    NSArray *nibViews = [nib instantiateWithOwner:self options:nil]; 
    accountCreateView = [nibViews objectAtIndex:0]; 
} 

[UIView transitionFromView:(displayingLoginView ? loginView : accountCreateView) 
        toView:(displayingLoginView ? accountCreateView : loginView) 
        duration:0.6 
        options:(displayingLoginView ? 
          UIViewAnimationOptionTransitionFlipFromRight : 
          UIViewAnimationOptionTransitionFlipFromLeft) 
       completion:^(BOOL finished) { 
        if (finished) { 
         displayingLoginView = !displayingLoginView; 
        } 
       } 
]; 

这工作得很好。但是,执行视图动画的代码不会。当文本字段变为活动状态时,将调用检查文本字段与键盘接近程度的代码,但在执行动画块时不会发生任何情况。

所以我检查:

if([UIView areAnimationsEnabled]) 
    NSLog(@"Animations are enabled"); 
else 
    NSLog(@"Animations are disabled"); 

的动画肯定启用。

所以我把它背进一步viewDidLoad中,尝试一个简单的动画,看看有什么工作,先天下之忧:

CGRect viewFrame = loginNameTextField.frame; 
viewFrame.origin.y = 400.f; 
[UIView animateWithDuration:1.f 
         delay:0.f 
        options:UIViewAnimationOptionCurveEaseInOut 
       animations:^ { 
        loginNameTextField.frame = viewFrame; 
       } 
       completion:NULL]; 

这工作得很好!文本字段在窗口中缓慢移动。

这什么都不做,那就是混淆的部分:从self.view.frame设置时

CGRect viewFrame = self.view.frame; 
viewFrame.origin.y = 400.f; 
[UIView animateWithDuration:1.f 
         delay:0.f 
        options:UIViewAnimationOptionCurveEaseInOut 
       animations:^ { 
        self.view.frame = viewFrame; 
       } 
       completion:NULL]; 

viewFrame有起源0,20和大小320460预期。

我试过直接设置框架属性:

CGRect viewFrame = self.view.frame; 
viewFrame.origin.y = 400.f; 
self.view.frame = viewFrame; 

貌似我可以改变self.view的子视图的框架,但不是self.view。修复程序可能是离开初始视图控制器作为故事板空白视图以及两者的登录视图中创建xibs和创建用户视图,并加载它们在viewDidLoad中 - 但为什么呢?

编辑:是的,切换视图控制器的故事板版本到一个普通的空视图和加入含有从作为一个子视图确实使动画重新工作一个XIB实际UI的图。尽管如此,仍然不知道为什么。

回答

1

如果你需要做的就是让你的键盘上方的文本字段,为什么不降的UIViewController并更改为一个UITableViewController和使用静态细胞?每个单元格放置一个文本字段(创建足够的单元格以满足您的需求)并以您喜欢的方式进行设计。当你没有第一响应者,并且屏幕上没有足够的单元格时,它将不会滚动。它不止适合什么,然后它将滚动到达底部/顶部单元格。然而,无论您有多少个单元格,如果您选择一个将被键盘覆盖的文本字段,设备将自动将单元格滚动到可查看的位置。它全部内置,并且我始终使用此功能。它适用于文本字段和文本视图。请记住注释掉部分的数量,每部分的行数以及索引路径方法的单元格,以便静态单元格可以正常工作。它节省了大量的编码。

HTH

罗布

+0

这是一个好主意,我可以看到它是方便,自动滚动(或更改表的框架,然后用scrollToRowAtIndexPath),但认为是比这一点更复杂为什么我需要转移包含的视图。 – 2012-02-01 22:14:32

+0

好的。我想我也会添加到我的帖子中,在某些情况下,它也有助于在UITableView中具有页眉和页脚视图。如果有帮助,你可以在这些地方放置更复杂的东西。当然,这限制了你将艰难的东西放在桌子视图的顶部和底部,这可能不是你想要的,这取决于你的设计。 – Rob 2012-02-02 10:40:57

相关问题