Add custom UIButton to UIKeyboard's accessory view for a UIWebView

后端 未结 2 1876
天命终不由人
天命终不由人 2021-01-07 08:46

I need to add a camera button to a UIWebView\'s keyboard accessory view toolbar (the one that already has the \"Back|Next\" and \"Done\" buttons).

Is th

相关标签:
2条回答
  • 2021-01-07 09:03

    I'm still looking for a better way to do it, but one solution for the moment would be to destroy the bar and recreate it like so :

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        UIWebView *web = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
        NSURL *aURL = [NSURL URLWithString:@"http://www.google.com"];
        NSURLRequest *aRequest = [NSURLRequest requestWithURL:aURL];
        [web loadRequest:aRequest];
        [self.view addSubview:web];
    
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    }
    
    - (void)keyboardWillShow:(NSNotification *)notification {
        [self performSelector:@selector(removeBar) withObject:nil afterDelay:0];
    }
    
    - (void)removeBar {
        UIWindow *keyboardWindow = nil;
        for (UIWindow *testWindow in [[UIApplication sharedApplication] windows]) {
            if (![[testWindow class] isEqual:[UIWindow class]]) {
                keyboardWindow = testWindow;
                break;
            }
        }
    
        for (UIView *possibleFormView in [keyboardWindow subviews]) {
            // iOS 5 sticks the UIWebFormView inside a UIPeripheralHostView.
            if ([[possibleFormView description] rangeOfString:@"UIPeripheralHostView"].location != NSNotFound) {
                for (UIView *subviewWhichIsPossibleFormView in [possibleFormView subviews]) {
                    if ([[subviewWhichIsPossibleFormView description] rangeOfString:@"UIWebFormAccessory"].location != NSNotFound) {
    
                        UISegmentedControl *nav = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Previous",@"Next", nil]];
                        nav.momentary = YES; 
                        nav.frame = CGRectMake(5, 8, 120, 30); 
                        nav.segmentedControlStyle = UISegmentedControlStyleBar;
                        nav.tintColor = [UIColor colorWithWhite:0.25 alpha:1];
                        [nav addTarget:self action:@selector(navigate) forControlEvents:UIControlEventValueChanged];
    
                        UIBarButtonItem *pictureBtn =[[UIBarButtonItem alloc] initWithTitle:@"Picture" style:UIBarButtonItemStyleBordered target:self action:@selector(takePic:)];
    
                        UIBarButtonItem *flexButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
                        UIBarButtonItem *doneButton =[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(resignKeyboard)];
    
                        NSArray *buttons = [NSArray arrayWithObjects:flexButton,pictureBtn,flexButton,doneButton, nil];
                        [(UIToolbar *)subviewWhichIsPossibleFormView addSubview:nav];
                        [(UIToolbar *)subviewWhichIsPossibleFormView setItems:buttons];
    
                    }
                }
            }
        }
    }
    

    But then, you have to implement the previous, next and done function again. But it's not the hardest part.

    0 讨论(0)
  • 2021-01-07 09:24

    there is an easier way to do this.

    Keep your keyboard notification in your viewDidLoad

    After that all you will need is the following method:

    -(void)keyboardDidShow:(NSNotification*)notif
    {
        NSArray *array = [[UIApplication sharedApplication] windows];
    
        for (UIWindow* wind in array) {
            for (UIView* currView in wind.subviews) {
                if ([[currView description] hasPrefix:@"<UIPeripheralHostView"]) {
                    for (UIView* perView in currView.subviews) {
                        if ([[perView description] hasPrefix:@"<UIWebFormAccessory"]) {
    
                            UIBarButtonItem *doneBttn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(resignKeyBoard)];
    
                            NSMutableArray *arr = [[NSMutableArray alloc] initWithArray: [(UIToolbar *) perView items]];
    
                        [arr addObject:doneBttn];
    
                        [(UIToolbar *) perView setItems:arr];
                        }
                    }
    
                }
            }
        }
    }
    

    I have basically taken the original prev/next buttons from the UIWebFormAccessory and added a done button to the end of it, but you can add what ever buttons you want to this.

    Some may think this shouldn't be implemented in -(void)keyboardDidShow: because you are changing the UI after it displays on screen, but so far I haven't noticed any issues with this. (only tested in simulator)

    Hope this was useful!

    0 讨论(0)
提交回复
热议问题