简体   繁体   中英

How to add a view on top of keyboard?

I have added a view with buttons on top of keyboard using setInputAccessoryView . Now i want functionality like when i click button from the view i want to display a pickerView on top of keyboard. Means like adding pickerView as subview of keyboard.

How can i do this?

Make a view you want to at the top of the keyboard. You can do this from xib or manually, but I think xib will be a better option.

Then make the reference to this view by doing this

 - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
   textField.inputAccessoryView = YOURCustomView;
   return YES;
}

Whenever you want to hide this or remove this just put this

textField.inputAccessoryView = nil;
self.pickerContainerView = [[UIView alloc] initWithFrame:CGRectMake(0, 194, 320, 224)];
    self.pickerContainerView.backgroundColor = [UIColor clearColor];
    [self.view addSubview:self.pickerContainerView];

    UIToolbar *pickerToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
    pickerToolbar.barStyle = UIBarStyleBlackTranslucent;
    [pickerToolbar sizeToFit];

    self.lblPickerViewTitle = [[UILabel alloc] initWithFrame:CGRectMake(15, 7, 230, 30)];
        self.lblPickerViewTitle.backgroundColor = [UIColor clearColor];
    [self.lblPickerViewTitle  setFont: [UIFont fontWithName:@"Arial-BoldMT" size:17]];
        self.lblPickerViewTitle.textAlignment = UITextAlignmentLeft;
        self.lblPickerViewTitle.textColor =[UIColor whiteColor];
    [pickerToolbar addSubview:self.lblPickerViewTitle];

    NSMutableArray *barItems = [[NSMutableArray alloc] init];
    UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
    [barItems addObject:flexSpace];
    [flexSpace release];

    UIBarButtonItem *btnCancel = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(closePickerView:)];
    [barItems addObject:btnCancel];
    [btnCancel release];

    UIBarButtonItem *btnDone = [[UIBarButtonItem alloc] initWithTitle:@"ShowPicker" style:UIBarButtonItemStyleBordered target:self action:@selector(donePickerView:)];
    [barItems addObject:btnDone];
    [btnDone release];

    [pickerToolbar setItems:barItems animated:YES];
    [barItems release];
    [self.pickerContainerView addSubview:pickerToolbar];

And in ShowPicker Method , write code for display UIPicker

You need to create another UIWindow first:

UIWindow *newWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0,100,320,20)];
newWindow.windowLevel = UIWindowLevelStatusBar; // this will make to place your WINDOW above the keyboard
[newWindow makeKeyAndVisible]; // show the new window

// [newWindow addSubview:yourView];

like add button on keyboard you can also add view like bellow...

here you find window of keyboard and then set frame of button and also yourView and then add to keyboard

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(keyboardDidShow:) 
                                                 name:UIKeyboardDidShowNotification 
                                               object:nil];
    return YES;
}
- (void)keyboardDidShow:(NSNotification *)note {
    UIButton *returnBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    returnBtn.frame = CGRectMake(0,-25,320,25);
    returnBtn.adjustsImageWhenHighlighted = NO;
    returnBtn.backgroundColor=[UIColor darkGrayColor];
    returnBtn.titleLabel.textColor=[UIColor whiteColor];
    [returnBtn setBackgroundImage:[UIImage imageNamed:@"keyBtn.png"] forState:UIControlStateNormal];

    [returnBtn addTarget:self action:@selector(keyboardBtn:) forControlEvents:UIControlEventTouchUpInside];
    // locate keyboard view
    UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
    UIView* keyboard;
    for(int i=0; i<[tempWindow.subviews count]; i++) {
        keyboard = [tempWindow.subviews objectAtIndex:i];
        // keyboard found, add the button
        if([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES)
            //  if (txtTag==5) {
            [keyboard addSubview:returnBtn];
    }
}
-(IBAction)keyboardBtn:(id)sender{
    UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
    UIView* keyboard;
    for(int i=0; i<[tempWindow.subviews count]; i++) {
        keyboard = [tempWindow.subviews objectAtIndex:i];
        // keyboard found, add the button
        if([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES)
            //  if (txtTag==5) {
            [keyboard addSubview:yourView];// here add your view with frame
    }
}

i hope this help you...

:)

From Jonas Schnelli's answer

UIWindow *newWindow = [[UIWindow alloc]initWithFrame:CGRectMake(0,100,320,20)];
newWindow.windowLevel = CGFLOAT_MAX; // this will make to place your WINDOW above the keyboard

[newWindow addSubview:yourView];

Just change UIWindowLevelStatusBar to CGFLOAT_MAX will be ok.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM