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