旋转设备时如何让我的inputAccessoryView调整大小?

时间:2011-11-15 17:28:43

标签: ios uitextview uikeyboard

我将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 个答案:

答案 0 :(得分:2)

这是一个棘手的问题。我在过去通过在旋转后配件视图布局时调整框架来解决这个问题。尝试这样的事情:

@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 :(得分:1)

瞧:

@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