Как я должен получить свой inputAccessoryView для изменения размера при вращении устройства? - PullRequest
7 голосов
/ 15 ноября 2011

Я присоединяю UIToolbar к своему UITextView в качестве inputAccessoryView, чтобы добавить кнопку для закрытия клавиатуры.Это прекрасно работает и выглядит правильно, когда устройство находится в портретном режиме.Но мне трудно понять, как изменить размер панели инструментов до меньшей высоты, используемой для панелей инструментов, когда устройство находится в альбомном режиме.

Я добавляю панель инструментов в метод делегата моего текстового представления -textViewShouldBeginEditing::

if (!textView.inputAccessoryView) {
    UIToolbar *keyboardBar = [[UIToolbar alloc] init];
    keyboardBar.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin;
    keyboardBar.barStyle = UIBarStyleBlackTranslucent;

    UIBarButtonItem *spaceItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissKeyboard:)];
    [keyboardBar setItems:[NSArray arrayWithObjects:spaceItem, doneButton, nil]];
    [spaceItem release];
    [doneButton release];

    [keyboardBar sizeToFit];

    textView.inputAccessoryView = keyboardBar;
    [keyboardBar release];
}

Я получаю странное поведение из этого кода в ландшафтном режиме.Если я начинаю редактировать в альбомном режиме, панель инструментов имеет высоту ландшафта, но кнопка «Готово» отображается на половине экрана.Если я затем поверну в портретный режим, кнопка «Готово» будет нарисована в правильном месте, и она останется в правильном месте, когда я вернусь в альбомный режим.

Если я начну редактировать в портретном режиме, панель инструментоврисуется с портретной высотой, но кнопка «Готово» отображается в правильном месте.Если я затем поверну в альбомный режим, панель инструментов останется портретной высотой, но кнопка «Готово» по-прежнему будет отображаться, по крайней мере, в правильном положении.

Есть предложения, как изменить размер при вращении устройства?Я действительно надеюсь, что есть более автоматический способ, чем ручное включение магических чисел высоты в одном из событий вращения контроллера представления.

Ответы [ 2 ]

2 голосов
/ 03 июля 2012

Это сложная проблема.Я решил эту проблему в прошлом, отрегулировав рамку, когда вспомогательный вид раскладывается после поворота.Попробуйте что-то вроде этого:

@interface RotatingTextInputToolbar : UIToolbar
@end

@implementation RotatingTextInputToolbar

- (void) layoutSubviews
{
    [super layoutSubviews];
    CGRect origFrame = self.frame;
    [self sizeToFit];
    CGRect newFrame = self.frame;
    newFrame.origin.y += origFrame.size.height - newFrame.size.height;
    self.frame = newFrame;

}
@end

И используйте RotatingTextInputToolbar вместо UIToolbar в своем коде выше.

1 голос
/ 23 июля 2012

Вуаля:

@interface AccessoryToolbar : UIToolbar @end

@implementation AccessoryToolbar

-(id)init
{
    if (self = [super init])
    {
        [self updateSize];
        NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
        [nc addObserver:self selector:@selector(orientationDidChange:) name:UIApplicationDidChangeStatusBarOrientationNotification object:NULL];
    }
    return self;
}

-(void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

-(void)orientationDidChange:(NSNotification*)notification
{
    [self updateSize];
}

-(void)updateSize
{
    bool landscape = UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation]);
    CGSize size = UIScreen.mainScreen.bounds.size;
    if (landscape != size.width > size.height)
        std::swap(size.width, size.height);
    if (size.height <= 320)
        size.height = 32;
    else
        size.height = 44;
    self.frame = CGRectMake(0, 0, size.width, size.height);
}

@end
...