Uiview self.view.frame在情节提要';s初始视图控制器

Uiview self.view.frame在情节提要';s初始视图控制器,uiview,ios5,uiviewanimation,uistoryboard,Uiview,Ios5,Uiviewanimation,Uistoryboard,这是一个奇怪的问题。我有一个iPhone视图控制器,用于创建具有一些文本字段的新用户,这些文本字段需要动画以避免显示键盘,即视图上下动画以保持键盘顶部和文本字段下边缘之间的最小间隙。当它从登录现有用户屏幕(故事板中的初始视图控制器)以模式显示时,效果很好 然后我决定稍微更改一下应用程序,以便登录/创建用户视图属于同一个视图控制器。他们是这样转变的: if(accountCreateView == nil) { UINib *nib = [UINib nibWithNibName:@"Ne

这是一个奇怪的问题。我有一个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,尺寸为320460

我尝试直接设置frame属性:

CGRect viewFrame = self.view.frame;
viewFrame.origin.y = 400.f;
self.view.frame = viewFrame;
看起来我可以更改self.view的子视图框架,但不能更改self.view的子视图框架。修复方法可能是将初始视图控制器保留为故事板中的空白视图,并为登录视图和创建用户视图创建XIB,然后将它们加载到viewDidLoad中——但为什么


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

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


Rob

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


Rob

这是一个好主意,我可以看到自动滚动(或更改表格的框架,然后使用ScrollToRowatineXpath)很方便,但是视图比它复杂一点,这就是为什么我需要移动包含的视图的原因。好的。我想我还应该在我的文章中补充一点,在某些情况下,在UITableView中有页眉和页脚视图也会有所帮助。如果有帮助的话,你可以把更复杂的东西放进去。当然,这就限制了您在表格视图的顶部和底部放置一些难以处理的内容,根据您的设计可能不需要这些内容。这是一个好主意,我可以看到自动滚动(或更改表格的框架,然后使用ScrollToRowatineXpath)非常方便但是这个视图比它复杂一点,这就是为什么我需要移动包含它的视图的原因。我想我还应该在我的文章中补充一点,在某些情况下,在UITableView中有页眉和页脚视图也会有所帮助。如果有帮助的话,你可以把更复杂的东西放进去。当然,这限制了您在表视图的顶部和底部放置硬的内容,而根据您的设计,这可能不是您想要的。