У меня странная проблема на ios 4.3. У меня есть один из моих экранов в ландшафтном режиме, нажатие кнопки представляет popover.My popover имеет панель поиска. Когда бы клавиатура не появлялась, она автоматически подталкивает мой поп-бит. Когда я ухожу клавиатура, popover уменьшает высоту. Это проблема только на ios 4.3.Несмотря на остальную часть ios, мой popover не уменьшает высоту после увольнения клавиатуры.
Отмена клавиатуры уменьшает высоту посева
Ответ 1
Я нашел ответ для этого. Это была ошибка с верхней стрелкой popover.If я использую направление левой стрелки для popover, все работает нормально.
Ответ 2
Ни один из ответов выше не работал у меня. По-видимому, клавиатура масштабирует представление и восстанавливает это масштабирование после уведомления UIKeyboardDidHideNotification, делая метод nowPopoverFromRect бесполезным при применении обработки этого уведомления. Способ, которым я решил это, был отсрочкой последнего вызова следующим образом:
- (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];
}
Ответ 3
Я ответил на очень похожий вопрос: Контроллер просмотра 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];
}
Ответ 4
Я тоже столкнулся с этой проблемой - в частности, popover не возвращался к своему размеру до клавиатуры после того, как удалился от popover. (Попкор будет расти, если пользователь отклонил клавиатуру напрямую или контроллер popover view подал первый ответчик).
К сожалению, я должен использовать направление верхней стрелки для popover из-за макета пользовательского интерфейса. Чтобы решить эту проблему, диспетчер представлений, отвечающий за 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 view устанавливает его свойство contentSizeForViewInPopover
в желаемый размер:
@implementation MyPopoverViewController
- (id)init
{
self = [super init];
if (self)
{
// ...
self.contentSizeForViewInPopover = CGSizeMake(320, 400); // desired size
}
return self;
}
Когда клавиатура вызывает сжатие popover, она влияет на popover popoverContentSize
, а не на контроллер вида contentSizeForViewInPopover
. Поэтому reset popoverContentSize
в методе делегирования MyController:
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
// Check if popoverController is valid, the popover you want, etc
popoverController.popoverContentSize = popoverController.contentViewController.contentSizeForViewInPopover;
}
Ответ 5
Привет После прохождения форума, я не думаю, что это ошибка после игры с размерами кадров много, работая над IOS 4,5,6,7, это то же поведение.
Решение для меня состояло в следующем:
1) Пойдите в конструктора 2) Открытие XIB ViewController, вызывающего проблему (т.е. PopOver). 3) Нажмите, чтобы выбрать VIEW. 4) Снимите флажок "AutoResizeSubviews" 5) При загрузке PopOver в код убедитесь, что вы выполните: 6) Your_Popup_Window.popoverContentSize = Your_ViewController.view.bounds.size;
Надеюсь, это поможет.
С уважением Хайдер Сати
Ответ 6
Вот мое решение:
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. В моем методе currentPopover:
- (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;
}