Подтвердить что ты не робот

Клавиатура UIWebView - избавление от панели "Предыдущий/Следующий/Готово"

Я хочу избавиться от панели поверх клавиатуры, которая появляется, когда вы фокусируете текстовое поле в веб-просмотре. У нас есть другие способы обращения с этим, и это лишние и ненужные.

панель клавиатуры webview http://beautifulpixel.com/assets/iPhone_Simulator-20100120-152330.png

Если вы столкнулись с этой проблемой, обязательно перейдите к https://bugreport.apple.com и дублируйте rdar://9844216

4b9b3361

Ответ 1

- (void)viewDidLoad {
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];

}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [[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) {
                    [subviewWhichIsPossibleFormView removeFromSuperview];
                }
            }
        }
    }
}

Это хорошо работает.

url: http://ios-blog.co.uk/iphone-development-tutorials/rich-text-editor-inserting-images-part-6/

Ответ 2

Это дополнение к ответу Yun. На iOS6 (6.0.1) может существовать горизонтальная серая рамка или теневая линия поверх строки, где раньше использовалась аксессуар (предыдущий/следующий/сделанный), прежде чем он был удален. Это исправление работает для меня, и я хотел бы поделиться. Любопытно слышать, работает ли он для вас.

Чтобы удалить границу, я добавил этот код во внутренний цикл removeBar():

if ([[subviewWhichIsPossibleFormView description] rangeOfString:@"UIImageView"].location != NSNotFound) {
    [[subviewWhichIsPossibleFormView layer] setOpacity: 0.0];
}

Нам нужно добавить структуру QuartzCore в начало файла .m, чтобы мы могли установить непрозрачность используемого слоя.

Итак, получим:

...

#import <QuartzCore/QuartzCore.h>

...

- (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) {
                    [subviewWhichIsPossibleFormView removeFromSuperview];
                }
                // iOS 6 leaves a grey border / shadow above the hidden accessory row
                if ([[subviewWhichIsPossibleFormView description] rangeOfString:@"UIImageView"].location != NSNotFound) {
                    // we need to add the QuartzCore framework for the next line
                    [[subviewWhichIsPossibleFormView layer] setOpacity: 0.0];
                }
            }
        }
    }
}

Ответ 3

Похоже, что есть очень простой способ, но я уверен, что он не пройдет обзор App Store. Может, у кого-то есть умная идея?;)

@interface UIWebBrowserView : UIView
@end

@interface UIWebBrowserView (UIWebBrowserView_Additions)
@end

@implementation UIWebBrowserView (UIWebBrowserView_Additions)

- (id)inputAccessoryView {
    return nil;
}

@end

Ответ 4

Для этого нет публичных API-интерфейсов. Вы можете удалить его, исследуя иерархию представлений и удалив представление, как предположили некоторые, но это было бы очень рискованно.

Вот почему это плохая идея:

Если у Apple нет официального API для удаления панели, у них могут быть веские причины для этого, и их собственный код может полагаться на то, что он там. Вы, возможно, никогда не столкнетесь с проблемой, потому что вы выполняете все ваши тесты (например) на английской клавиатуре. Но что делать, если вид, который вы удаляете, требуется для ввода на другом языке или для целей доступности? Или что, если в будущей версии iOS их собственная реализация изменяется так, что она предполагает, что представление всегда есть? Ваш код выйдет из строя, и вы будете застревать, чтобы получить обновление, в то время как разочарованные пользователи ждут недели.

Интересно, что добавленный ответ Remco доказывает этот момент. На iOS 6.0.1 было внесено изменение, требующее исправления для взлома. Любой, кто реализовал взлом для ios 5, был вынужден сделать обновление в результате. К счастью, это было только эстетическое изменение, но это могло быть намного хуже.

Ответ 5

Я думал перехватить уведомление UIKeyboardWillAppear и вместо этого передать его в скрытое текстовое поле и переадресовать события через javascript на реальный в webview. Но это кажется волосатым. Теперь перемещение и выбор курсора будут сосать.

Ответ 6

проверить это. https://gist.github.com/2048571. Он работает в iOS 5 и более поздних версиях, не работает для более ранних версий.

Ответ 7

этот код определенно работает для меня... надеюсь, что это также сработает для вас.

- (void)viewDidLoad{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
}


-(void)viewWillAppear:(BOOL)animated{
    [[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 {
    // Locate non-UIWindow.
    UIWindow *keyboardWindow = nil;
    for (UIWindow *testWindow in [[UIApplication sharedApplication] windows]) {
        if (![[testWindow class] isEqual:[UIWindow class]]) {
            keyboardWindow = testWindow;
            break;
        }
    }

    // Locate UIWebFormView
    for (UIView *possibleFormView in [keyboardWindow subviews]) {
        if ([[possibleFormView description] hasPrefix:@"<UIPeripheralHostView"]) {
            for (UIView* peripheralView in [possibleFormView subviews]) {

                // hides the backdrop (iOS 7)
                if ([[peripheralView description] hasPrefix:@"<UIKBInputBackdropView"]) {
                    //skip the keyboard background....hide only the toolbar background
                    if ([peripheralView frame].origin.y == 0){
                        [[peripheralView layer] setOpacity:0.0];
                    }
                }
                // hides the accessory bar
                if ([[peripheralView description] hasPrefix:@"<UIWebFormAccessory"]) {
                    // remove the extra scroll space for the form accessory bar
                    UIScrollView *webScroll;
                    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 5.0) {
                        webScroll = [[self webviewpot] scrollView];
                    } else {
                        webScroll = [[[self webviewpot] subviews] lastObject];
                    }
                    CGRect newFrame = webScroll.frame;
                    newFrame.size.height += peripheralView.frame.size.height;
                    webScroll.frame = newFrame;

                    // remove the form accessory bar
                    [peripheralView removeFromSuperview];
                }
                // hides the thin grey line used to adorn the bar (iOS 6)
                if ([[peripheralView description] hasPrefix:@"<UIImageView"]) {
                    [[peripheralView layer] setOpacity:0.0];
                }
            }
        }
    }
}

Ответ 8

Не легко. Вы могли бы попытаться заглянуть в подземелья в веб-представлении, но это было бы табу с Apple.

Как не помещать текстовое поле в веб-страницу на веб-странице и явно добавлять текстовое поле/текстовое представление в веб-представление, чтобы оно вообще не отображало навигационную панель, и вы можете добавить свой собственный с нуля?

Ответ 9

[[NSNotificationCenter defaultCenter] addObserver:self

                                         selector:@selector(keyboardWasShown:)

                                             name:UIKeyboardDidShowNotification object:nil];
-(void)keyboardWasShown:(NSNotification*)aNotification
{
UIWindow* tempWindow;

    //Because we cant get access to the UIKeyboard throught the SDK we will just use UIView.
    //UIKeyboard is a subclass of UIView anyways
    UIView* keyboard;

    //Check each window in our application
    for(int c = 0; c < [[[UIApplication sharedApplication] windows] count]; c ++)
    {
            //Get a reference of the current window
            tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:c];

            //Get a reference of the current view
            for(int i = 0; i < [tempWindow.subviews count]; i++)
            {
                    keyboard = [tempWindow.subviews objectAtIndex:i];

                    if([[keyboard description] hasPrefix:@"<UIPeripheralHostView"] == YES)
                    {      
            keyboard.hidden = YES;
            UIView* keyboardLayer;
            for(int n = 0; n < [keyboard.subviews count]; n++)
            {
                keyboardLayer = [keyboard.subviews objectAtIndex:n];
                NSLog(@" keyboardLayer ::: %@ " ,keyboardLayer);
                if([[keyboardLayer description] hasPrefix:@"<UIWebFormAccessory"] == YES)
                {
                    [keyboardLayer removeFromSuperview ];
                }
            }
            keyboard.hidden = NO;

                    }
            }
    }

 NSLog(@"keyboardWasShown" );

}

проверьте это: http://pastebin.com/s3Fkxvsk