Cocoa touch 键盘调整减少了高度过高

Cocoa touch 键盘调整减少了高度过高,cocoa-touch,ios,Cocoa Touch,Ios,我在ios 4.3上遇到了一个奇怪的问题。我的一个屏幕处于横向模式,点击一个按钮就会显示一个弹出框。我的弹出框有一个搜索栏。每当键盘出现时,它会自动将我的弹出框向上推。当我退出键盘时,弹出框的高度会降低。这是ios 4.3上唯一的问题。而在ios的其余部分,键盘报废后,我的popover没有降低高度。我找到了答案。这是popover顶部箭头的错误。如果我使用左箭头方向的popover,一切正常。我在这里回答了一个非常类似的问题: 我绕过它的方法是观察控制UIPopoverController的控

我在ios 4.3上遇到了一个奇怪的问题。我的一个屏幕处于横向模式,点击一个按钮就会显示一个弹出框。我的弹出框有一个搜索栏。每当键盘出现时,它会自动将我的弹出框向上推。当我退出键盘时,弹出框的高度会降低。这是ios 4.3上唯一的问题。而在ios的其余部分,键盘报废后,我的popover没有降低高度。

我找到了答案。这是popover顶部箭头的错误。如果我使用左箭头方向的popover,一切正常。

我在这里回答了一个非常类似的问题:

我绕过它的方法是观察控制UIPopoverController的控制器中的键盘消失:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(presentSearchPopover) name:UIKeyboardDidHideNotification object:nil];
然后在
-presentsearchpover
中,再次呈现UIPopoverController(这是一个非常无缝的转换):

不要忘记在
-dealloc
或类似文件中删除观察者:

- (void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object:nil];

    [super dealloc];
}

上面的答案都不适合我。显然,键盘会在UIKeyboardDidHideNotification通知后缩放视图并恢复此缩放,从而使presentPopoverFromRect方法在应用于处理此通知时无效。 我解决这个问题的方法是延迟后一个电话,如下所示:

- (void)viewDidLoad
{
    [super viewDidLoad];
    popup = nil;        //my ViewController with UITextField
    popover = nil;      //my UIPopoverController
    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    [nc addObserver:self
           selector:@selector(resizePopup:)
               name:UIKeyboardDidHideNotification
             object:nil];
}

- (void)doDelayedResize
{
    [popover presentPopoverFromRect:myButton.bounds inView:myButton permittedArrowDirections:UIPopoverArrowDirectionAny  animated:YES];
}

- (void)resizePopup:(NSNotification*)note
{
    [self performSelector:@selector(doDelayedResize) withObject:nil afterDelay:0.01]; 
}

我也遇到了这个问题——特别是,在敲击popover之后,popover并没有恢复到键盘前的大小。(如果用户直接关闭键盘或popover的视图控制器退出第一响应者,popover将重新增长)

不幸的是,由于UI的布局,我不得不为popover使用上箭头方向。为了解决这个问题,负责popover的视图控制器实现了
-(void)PopOvercontrollerdDismissPopover:(UIPopoverController*)popoverController
。例如:

@interface MyController : UIViewController <UIPopoverControllerDelegate>
{
    // ...
}
//...
@end
此外,my popover的视图控制器将其
contentSizeForViewInPopover
属性设置为所需的大小:

@implementation MyPopoverViewController
- (id)init
{
    self = [super init];
    if (self)
    {
        // ...
        self.contentSizeForViewInPopover = CGSizeMake(320, 400);  // desired size
    }
    return self;
}
当键盘导致popover收缩时,它会影响popover的
PopoOverContentSize
,而不会影响其视图控制器的
contentSizeForViewInPopover
。因此,在MyController的委托方法中重置
popoverContentSize

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
    // Check if popoverController is valid, the popover you want, etc
    popoverController.popoverContentSize = popoverController.contentViewController.contentSizeForViewInPopover;
}

大家好,在浏览了论坛之后,我不认为这是一个bug,在玩了很多框架大小的游戏之后,在IOS 4,5,6,7上工作,这是相同的行为

我的解决方案是:

1) 走进设计师的怀抱 2) 打开导致问题的XIB ViewController(即PopOver控制器)。 3) 单击以选择其视图。 4) 取消选中“自动调整子视图” 5) 在代码中加载PopOver时,请确保执行以下操作: 6) 您的\u Popup\u Window.popoverContentSize=您的\u ViewController.view.bounds.size

我希望这有帮助

问候 Heider Sati

以下是我的解决方案:

1.注册键盘通知(
UIKeyboardWillShowNotification,UIKeyboardWillHideNotification

2.创建局部变量:

CGSize _currentPopoverContentSize; //if you want to have custom size for popover

UIView *_currentPopoverSender; //to remember from wich view you will present popover

BOOL _keyboardIsShown; //enable in keyboardWillShow, and disable in keyboardWillHide
3.在我的presentPopover方法中:

- (void)presentPopoverControllerWithSize:(CGSize)size fromView:(UIView *)sender{

MyController *controller = [[[MyController alloc] init] autorelease];

if (self.popover)
{
    [_popover release];
    _popover = nil;
}

_popover = [[UIPopoverController alloc] initWithContentViewController:controller];
_popover.popoverContentSize = size;
_popover.delegate = self;

//checking if keyboard is shown - if NO, than present popover, if YES - just `resignFirstResponder` for your _`activeTextField`(you can set it in -textFieldDidBeginEditing: and nullify in -textFieldDidEndEditing:)
if (!_keyboardIsShown)
{
    [_popover presentPopoverFromRect:[sender bounds]
                              inView:sender
            permittedArrowDirections:UIPopoverArrowDirectionUp
                            animated:YES];
}
else
{
    [_activeTextField resignFirstResponder];
}

_currentPopoverContentSize = size;
_currentPopoverSender = sender;
}
4.比:

- (void)keyboardWillBeHidden:(NSNotification*)aNotification{

[UIView animateWithDuration:0.3
                 animations:^{
                     //do some stuff
                     [self.scrollView setContentSize:_scrollViewContentSize];

                 } completion:^(BOOL finished) {

                     if (_popover && _currentPopoverSender)
                     {
                         [_popover presentPopoverFromRect:[_currentPopoverSender bounds]
                                                   inView:_currentPopoverSender
                                 permittedArrowDirections:UIPopoverArrowDirectionUp
                                                 animated:YES];
                     }

                 }];

_keyboardIsShown = NO;
}

我的应用程序也有同样的问题。我会尽快发布答案。我也有同样的问题,可以验证使用任何箭头方向都不能解决问题:(如果你的popover没有与键盘重叠,UIPopoverArrowDirectionLeft似乎可以解决问题。你的“延迟”策略是我唯一能做的事情——唯一的负面影响是动画中的一点弹跳——但在苹果修复之前总比什么都没有好……谢谢!
- (void)presentPopoverControllerWithSize:(CGSize)size fromView:(UIView *)sender{

MyController *controller = [[[MyController alloc] init] autorelease];

if (self.popover)
{
    [_popover release];
    _popover = nil;
}

_popover = [[UIPopoverController alloc] initWithContentViewController:controller];
_popover.popoverContentSize = size;
_popover.delegate = self;

//checking if keyboard is shown - if NO, than present popover, if YES - just `resignFirstResponder` for your _`activeTextField`(you can set it in -textFieldDidBeginEditing: and nullify in -textFieldDidEndEditing:)
if (!_keyboardIsShown)
{
    [_popover presentPopoverFromRect:[sender bounds]
                              inView:sender
            permittedArrowDirections:UIPopoverArrowDirectionUp
                            animated:YES];
}
else
{
    [_activeTextField resignFirstResponder];
}

_currentPopoverContentSize = size;
_currentPopoverSender = sender;
}
- (void)keyboardWillBeHidden:(NSNotification*)aNotification{

[UIView animateWithDuration:0.3
                 animations:^{
                     //do some stuff
                     [self.scrollView setContentSize:_scrollViewContentSize];

                 } completion:^(BOOL finished) {

                     if (_popover && _currentPopoverSender)
                     {
                         [_popover presentPopoverFromRect:[_currentPopoverSender bounds]
                                                   inView:_currentPopoverSender
                                 permittedArrowDirections:UIPopoverArrowDirectionUp
                                                 animated:YES];
                     }

                 }];

_keyboardIsShown = NO;
}