Удаление помощника с клавиатуры в автономном веб-приложении для iPhone - PullRequest
16 голосов
/ 26 октября 2011

Можно ли удалить помощник по формам из всплывающей клавиатуры iPhone в автономном веб-приложении?Я знаю, что общее мнение заключается в том, что это невозможно в Mobile Safari, но автономное приложение работает в UIWebView и работает по-разному в нескольких направлениях ( пример ), поэтому я надеюсь, что это возможно.

Здесь вы можете увидеть это прямо над клавиатурой:

enter image description here

Кнопки «Предыдущая» и «Следующая» переключаются между <form> входами.Но у меня есть один элемент <input>, поэтому они отключены.Кнопка «Готово» скрывает клавиатуру, но, поскольку у меня есть высотный <ul> (который занимает пространство между клавиатурой и <input>), и у меня больше ничего нет на этой странице, это не имеет смысла.

На крошечном экране, и почти половина экрана занята клавиатурой, 44 пикселя, составляющие эту панель инструментов, - это огромная трата пространства (всего <li>).

Собственные приложения для iOS могут удалить его, так что я знаю, что по крайней мере это возможно по телефону, я просто не нашел способ сделать это в веб-приложении.Это из приложения Facebook, и страница очень похожа на мою:

enter image description here

Я пытался использовать <input>, не завернутый в <form>, а также с помощьюcontenteditable <div>, но результаты были одинаковыми.Существует несколько пользовательских стилей -webkit- для управления различными аспектами интерфейса веб-приложения, но они плохо документированы, и поиск ничего не дал по этому поводу.

Любой способ удалить помощника по форме в веб-приложении

Ответы [ 3 ]

12 голосов
/ 29 января 2012

Если ваше приложение является веб-приложением, встроенным в собственное приложение Objetive-C, это возможно путем манипулирования представлениями клавиатуры.

Сначала зарегистрируйтесь, чтобы получить уведомление клавиатурыDidShow:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];

при вызове клавиатуры будет вызываться следующий метод:

-(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"]) {
                        [perView setHidden:YES];
                    }
                }

            }
        }
    }
}

этот метод перебирает представления на экране в поисках помощника по формам и скрывает его.

ПРИМЕЧАНИЕ: Apple, вероятно, не откажется от этого, так как я видел, что это используется Facebook и т. Д., Но эта техника может сломаться в будущих выпусках iOS.

5 голосов
/ 27 января 2012

Все признаки указывают на то, что невозможно , включая несколько вопросов здесь .

1 голос
/ 04 октября 2012

Вы можете сделать категорию UIView и «переопределить» поведение addSubview: как в примере ниже. Вызовите метод exachangeMethods из вашего applicationDidFinishLaunching вашего AppDelegate.

#import "UIView+util.h"
#import <objc/runtime.h>

@implementation UIView (util)

// Swaps our custom implementation with the default one
// +load is called when a class is loaded into the system
+ (void) exchangeMethods
{
    SEL origSel = @selector(addSubview:);

    SEL newSel = @selector(customAddSubview:);

    Class viewClass = [UIView class];

    Method origMethod = class_getInstanceMethod(viewClass, origSel);
    Method newMethod = class_getInstanceMethod(viewClass, newSel);
    method_exchangeImplementations(origMethod, newMethod);
}
- (void) customAddSubview:(UIView *)view{

    if( [[view description]rangeOfString:@"<UIWebFormAccessory"].location!=NSNotFound) {
        return;
    }

    // This line at runtime does not go into an infinite loop
    // because it will call the real method instead of ours.
    return [self customAddSubview:view];

}

@end
...