如何在显示UIPickerView时向上移动视图

时间:2012-08-08 23:15:40

标签: ios xcode uipickerview nsnotificationcenter

我有一个主视图,包含我的所有文本字段和按钮。对于我的文本字段,我使用inputView来显示UIPickerViews而不是键盘。我想知道当选择文本字段时,我可以将视图向上移动,这样拾取器和拾取器工具栏不会覆盖文本字段,因为我在底部有一些文本字段被它覆盖。我尝试使用带有表视图的教程中的以下代码,但它对我不起作用。它构建没有错误,但它不能正常工作。视图刚刚消失,然后只有当pickerView被解除时它才会返回到一半。

    - (void)viewDidLoad {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pickerShown:) name:UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(pickerHidden:) name:UIKeyboardWillHideNotification object:nil];

}

-(void)pickerShown:(NSNotification *)note {
CGRect pickerFrame;
[[[note userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey]   getValue:&pickerFrame];
CGRect scrollViewFrame = mainView.frame;
scrollViewFrame.size.height -= pickerFrame.size.height;
[mainView setFrame:pickerFrame];
}
-(void)pickerHidden:(NSNotification*)note{
[mainView setFrame:self.view.bounds];
}

这接近我需要做的事吗?

2 个答案:

答案 0 :(得分:2)

我建议看一下this tutorial“滑动UITextFields以避开键盘”。

在您的情况下,您需要将textFieldDidBeginEditing中的代码放在pickerShown方法中,然后更改拾取器高度的键盘高度常量。

希望这会有所帮助:)

答案 1 :(得分:0)

对于那些寻找替代解决方案的人来说,这里是one。我把它变成了一个可以在复杂项目中重复使用的库。

/* In Keyboard.m */
static NSUInteger verticalOffset = 0;

+ (void)moveViewForKeyboard:(UITextField *)theTextField inView:(UIView *)view
{
    /* Move 200 for keyboard, change the number for other types */
    [self moveViewUp:view withOffset:theTextField.frame.origin.y - 200];
}

+ (void)moveViewUp:(UIView *)view withOffset:(int)offset
{
    if(offset < 0) 
        offset = 0;

    if(offset != verticalOffset) 
    {
        [self moveView:view withOffset:offset - verticalOffset];
        verticalOffset = offset;
    }
}

+ (void)moveViewOnEndEditing:(UIView *)view
{
    if(verticalOffset != 0)
    {
        [self moveView:view withOffset:-verticalOffset];
        verticalOffset = 0;
    }
}

+ (void)moveView:(UIView *)view withOffset:(int)offset
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];

    CGRect rect = view.frame;
    rect.origin.y -= offset;
    rect.size.height += offset;
    view.frame = rect;

    [UIView commitAnimations];
}

在视图中以这种方式使用它:

- (void)textFieldDidBeginEditing:(UITextField *)theTextField
{
    [Keyboard moveViewForKeyboard:theTextField inView:self.view];
}

- (void)textFieldDidEndEditing:(UITextField *)theTextField
{
    [Keyboard moveViewOnEndEditing:self.view];
}