在iPhone独立Web应用程序中从键盘中删除表单助手

时间:2011-10-26 15:20:49

标签: iphone html css iphone-web-app iphone-standalone-web-app

是否可以从独立网络应用程序中的iPhone弹出键盘中删除表单助手?我知道普遍的共识是它在Mobile Safari中是不可能的,但是一个独立的应用程序在UIWebView中运行,并且在几个方面(example)的功能不同,所以我希望这可能是可能的

你可以在键盘正上方看到它:

enter image description here

“上一个”和“下一个”按钮在<form>输入之间循环。但是我有一个<input>元素,所以它们被禁用了。完成按钮隐藏了键盘,但由于我有一个高度灵活的<ul>(占据了键盘和<input>之间的空间),而且我在此页面上没有其他任何内容,因此它不会目的

在一个小屏幕上,几乎有一半的屏幕被键盘占用,组成这个工具栏的44个像素是一个巨大的空间浪费(整个<li>的价值)。

原生iOS应用可以删除它,所以我知道它至少可以在手机上使用,我只是没有发现在网络应用中这样做的方法。这是来自Facebook应用程序,页面与我的非常相似:

enter image description here

我尝试使用未<input>并且使用<form> contenteditable的{​​{1}},但结果相同。有几种自定义<div>样式可用于控制Web应用程序界面的各个方面,但它们的文档记录很少,而且搜索结果没有任何内容。

如何删除网络应用中的表单助手?

3 个答案:

答案 0 :(得分:12)

如果您的应用是包含在原生Objetive-C应用中的网络应用,则可以通过操作键盘视图来实现。

首先,注册接收keyboardDidShow通知:

[[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版本中出现。

答案 1 :(得分:5)

所有迹象都指向此not being possible,包括several questions here

答案 2 :(得分:1)

您可以执行UIView类别并“覆盖”addSubview的行为:如下例所示。从您的AppDelegate的applicationDidFinishLaunching中调用方法“exachangeMethods”。

#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