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

我将一个UIToolbar作为其inputAccessoryView附加到我的UITextView中,以添加一个按钮来关闭键盘。 这工作很好,当设备处于肖像模式时它看起来是正确的。 但是我无法弄清楚当设备处于横向模式时,如何将工具栏的大小调整为工具栏的较低高度。

我在我的文本视图的委托的-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];
}

不过,我在横向模式下从此代码中获得了奇怪的行为。 如果我在横向模式下开始编辑,工具栏具有横向高度,但“完成”按钮在屏幕的一半处绘制。 如果我然后旋转到肖像模式,完成按钮被绘制在正确的位置,并且当我旋转回风景模式时,它将保持在正确的位置。

如果我以纵向模式开始编辑,则工具栏将以纵向绘制高度,但完成按钮绘制在正确的位置。 如果我然后旋转到横向模式,工具栏保持纵向高度,但完成按钮至少仍然绘制在正确的位置。

有关如何在设备旋转时调整大小的任何建议? 我真的希望有一种更自动的方式,而不是手动插入视图控制器旋转事件之一中的高度幻数。


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

@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


瞧:

@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
链接地址: http://www.djcxy.com/p/10011.html

上一篇: How should I get my inputAccessoryView to resize when rotating device?

下一篇: A way to monitor when a Control's screen location changes?