在storyboard初始视图控制器中,self.view.frame不再是动画

时间:2012-02-01 00:03:19

标签: uiview ios5 uiviewanimation uistoryboard

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

然后我决定更改应用程序,以便登录/创建用户视图属于同一个视图控制器。他们这样过渡:

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];

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

这没有任何作用,这是令人困惑的部分:

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];
从self.view.frame设置时,

viewFrame的原点为0,20,大小为320,460。

我尝试直接设置frame属性:

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

看起来我可以更改self.view的子视图框架,但不能更改self.view的子视图框架。修复可能是将初始视图控制器保留为故事板中的空白视图,并为登录视图创建xib并创建用户视图并在viewDidLoad中加载它们 - 但为什么?

编辑:是的,将视图控制器的故事板版本切换为纯空视图,并将包含xib中实际UI的视图添加为子视图,这样可以使动画再次起作用。但仍然不知道为什么。

1 个答案:

答案 0 :(得分:1)

如果您只需将文本字段保留在键盘上方,为什么不放弃UIViewController并更改为UITableViewController并使用静态单元格?您为每个单元格放置一个文本字段(创建足够的单元格以满足您的需要)并根据您的喜好设置样式。当您没有第一响应者并且屏幕上没有足够的单元格时,它将不会滚动。它有更多适合的东西,然后滚动到达底部/顶部单元格。然而,无论您拥有多少个单元格,如果您选择将被键盘覆盖的文本字段,设备将自动将单元格滚动到可查看的位置。它都是内置的,我一直使用这个功能。它适用于文本字段和文本视图。只需记住注释掉部分的数量,每个部分的行数以及索引路径方法的单元格,这样静态单元格就能正常工作。它节省了大量的编码。

HTH

罗布