旋转设备时,如何让我的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?