1

这是一个奇怪的问题。我有一个 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,如预期的那样。

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

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

看起来我可以更改 self.view 的子视图框架,但不能更改 self.view 的子视图框架。解决方法可能是将初始视图控制器保留为情节提要中的空白视图,并为登录视图和创建用户视图创建 xibs 并将它们加载到 viewDidLoad - 但为什么呢?

编辑:是的,将视图控制器的情节提要版本切换到普通的空视图并将包含来自 xib 的实际 UI 的视图添加为子视图确实可以使动画再次起作用。仍然不知道为什么。

4

1 回答 1

1

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

高温高压

于 2012-02-01T21:06:54.607 回答