问题 键盘重新调整可减少弹出高度


我在ios 4.3上有一个奇怪的问题。我有一个横向模式的屏幕,点击一个按钮就会出现一个popover.My popover有一个搜索栏。每当键盘出现时它会自动推动我的popover位。当我退出键盘时, popover减少了高度。这只是在ios 4.3上的问题。而在其余的ios中,我的popover在键盘解雇后不会降低高度。


12330
2018-04-01 12:31


起源

我的应用程序存在同样的问题。我会尽快发一个答案。 - AlexVogel


答案:


以上答案都不适合我。显然,键盘缩放视图并在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]; 
}

7
2018-04-27 10:00



你的“延迟”战术是我唯一能够开始工作的东西 - 唯一的负面影响就是动画中的一点点反弹 - 但是直到Apple修复之前总比没有好......谢谢! - rcw3


我在这里回答了一个非常相似的问题 键盘消失后,UIPopoverController的视图控制器会调整大小

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

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(presentSearchPopover) name:UIKeyboardDidHideNotification object:nil];

然后在 -presentSearchPopover,再次呈现UIPopoverController(这是一个非常无缝的过渡):

- (void)presentSearchPopover
{
    self.searchPopoverController.popoverContentSize = CGSizeMake(width, height));

    [self.searchPopoverController presentPopoverFromRect:someRect) inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
}

不要忘记删除观察者 -dealloc 或类似的:

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

    [super dealloc];
}

3
2018-04-20 16:19





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


1
2018-04-05 03:43



我有同样的问题,可以验证使用任何箭头方向 不 解决这个问题。 :( - raheel
如果您的弹出窗口不与键盘重叠,UIPopoverArrowDirectionLeft似乎可以解决问题。 - palaniraja


我也遇到了这个问题 - 具体来说,在弹出popover之后,popover没有恢复到它的键盘前尺寸。 (如果用户直接解除键盘或弹出窗口的视图控制器重新响应第一响应者,则弹出窗口会重新生成)。

不幸的是,由于UI的布局,我必须使用顶部箭头方向来设置popover。为了解决这个问题,负责弹出窗口的视图控制器实现了 - (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController。例如:

@interface MyController : UIViewController <UIPopoverControllerDelegate>
{
    // ...
}
//...
@end

将该控制器设置为popover的委托:

MyPopoverViewController *popoverVC = [[MyPopoverViewController alloc] init];
UIPopoverController *myPopover = [[UIPopoverController alloc] initWithContentViewController:popoverVC];
myPopover.delegate = self;
// Hang on to popoverVC, myPopover or release them as desired...

另外,我的popover的视图控制器设置它 contentSizeForViewInPopover 属性到所需的大小:

@implementation MyPopoverViewController
- (id)init
{
    self = [super init];
    if (self)
    {
        // ...
        self.contentSizeForViewInPopover = CGSizeMake(320, 400);  // desired size
    }
    return self;
}

当键盘导致弹出窗口缩小时,它会影响弹出窗口 popoverContentSize 而不是它的视图控制器 contentSizeForViewInPopover。因此,重置 popoverContentSize 在MyController的委托方法中:

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

1
2017-07-05 17:29





这是我的解决方案:

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。 在我目前的过程方法中:

- (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;
}

0
2018-03-22 11:49





嗨在浏览完论坛之后,我认为在使用框架尺寸之后,这不是一个错误,在IOS 4,5,6,7上工作也是一样的行为。

我的解决方案是:

1)进入设计师 2)打开导致问题的XIB ViewController(即PopOver)。 3)单击以选择它的视图。 4)取消选中“AutoResizeSubviews” 5)在代码中加载PopOver时,请确保执行以下操作: 6)Your_Popup_Window.popoverContentSize = Your_ViewController.view.bounds.size;

我希望这有帮助。

亲切的问候 Heider Sati


0
2018-01-09 10:59