遵循 UI Segue 会破坏我的视图框架

Posted

技术标签:

【中文标题】遵循 UI Segue 会破坏我的视图框架【英文标题】:Following a UI Segue corrupts my view's frame 【发布时间】:2013-11-06 20:53:45 【问题描述】:

我有一个带有底部工具栏的 DetailViewController。

这个工具栏有 UIButtons 和 UITextField 对象。

为了让这些 UITextField 在编辑时可见,我使用了以下例程:

- (void) returnMainViewToInitialposition:(NSNotification*)aNotification
    [self scrollViewForKeyboard:aNotification up:NO];


- (void) scrollViewForKeyboard:(NSNotification*)aNotification up:(BOOL) up
    if (_detailItem && ( self.addressTextField.editing || self.urlTextField.editing || self.titleTextField.editing )) 
        NSDictionary* userInfo = [aNotification userInfo];

        // Get animation info from userInfo
        NSTimeInterval animationDuration;
        UIViewAnimationCurve animationCurve;
        CGRect keyboardFrame;
        [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
        [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
        [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardFrame];
        CGFloat _keyboardHeight = ([[UIDevice currentDevice] orientation] == UIDeviceOrientationPortrait || [[UIDevice currentDevice] orientation] == UIDeviceOrientationPortraitUpsideDown) ? keyboardFrame.size.height : keyboardFrame.size.width;
        // Animate up or down
        [UIView beginAnimations:nil context:nil];
        [UIView setAnimationDuration:animationDuration];
        [UIView setAnimationCurve:animationCurve];
        [self.view setFrame:CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y + _keyboardHeight * (up?-1:1), self.view.frame.size.width, self.view.frame.size.height)];
        [UIView commitAnimations];
        NSLog(@"detailView bounds: %.0f, (%.0f + %.0f x %d), %3.0f, %3.0f", self.view.frame.origin.x, self.view.frame.origin.y + _keyboardHeight * (up?-1:1), _keyboardHeight, (up?-1:1), self.view.frame.size.width, self.view.frame.size.height);

    


+ (CGRect) convertRect:(CGRect)rect toView:(UIView *)view 
    UIWindow *window = [view isKindOfClass:[UIWindow class]] ? (UIWindow *) view : [view window];
    return [view convertRect:[window convertRect:rect fromWindow:nil] fromView:nil];

它可以工作,直到我将另一个视图推到当前视图之上,然后将其弹回。 然后我在编辑它们时看不到我的 UITextField。

上面的 NSLog 是这样说的:

推前(工作):

detailView bounds: 0, (-704 + 352 x -1), 703, 768

弹出后(不):

detailView bounds: 0, (352 + 352 x 1), 703, 768

看来我的 UIViewController 在 push/pop 之间丢失了 self.view.frame.origin.y...

在 IB 中,两个视图(detailView 和 pushView)的所有大小都设置为“推断”。两个视图的以下选项也同样检查:

调整滚动视图插图 在推送时隐藏底栏 延伸边缘:在顶栏下方 " " : 在底栏下 " " : 在不透明条下

那么,我的观点发生了什么变化? 感谢您的帮助。

【问题讨论】:

【参考方案1】:

与往常一样,它是关于如何添加观察者的: 它们不应添加到viewDidLoad 方法中,而应添加到viewWillAppear 中。 现在已经修复了。

【讨论】:

以上是关于遵循 UI Segue 会破坏我的视图框架的主要内容,如果未能解决你的问题,请参考以下文章

为啥更改 UITextView 的框架原点会完全破坏我的整个框架大小?

使用自动布局读取 UI 正确框架

框架破坏,但如果是我的话

无法禁用 Django CSRF 框架并且正在破坏我的网站

在具有可变框架的视图上添加子视图

000_MVC常用约定