iPhone独立网页应用如何从键盘中移除表单助手?

16
在一个独立的 web 应用程序中,是否有可能从 iPhone 弹出键盘中删除表单助手?我知道在 Mobile Safari 中一般的共识是不可能的,但是一个独立的应用程序运行在一个 UIWebView 中,并且在几个方面(例如:示例)具有不同的功能,所以我希望这是可能的。
你可以在键盘上方看到它: enter image description here 前一个和下一个按钮在 <form> 输入框之间循环。但是,我只有一个 <input> 元素,因此它们被禁用了。完成按钮隐藏键盘,但是由于我有一个高度可调节的 <ul> (占用键盘和 <input> 之间的空间),而且在这个页面上没有其他内容,它没有任何作用。
在一个小屏幕上,由于键盘占据了近一半的屏幕,占据这个工具栏的 44 个像素是巨大的浪费(一个整个 <li> 的价值)。
本机 iOS 应用程序可以删除它,所以我知道在手机上至少是可能的,但我还没有发现在 web 应用程序中如何实现。这是来自 Facebook 应用的截图,页面与我的非常相似: enter image description here 我尝试过使用未包装在 <form> 中的 <input> 和使用 contenteditable <div>,但结果都一样。有几种自定义的 -webkit- 样式来控制 Web 应用程序界面的各个方面,但是它们文档不全,搜寻也找不到相关信息。
是否有任何方法从 web 应用程序中删除表单助手?
3个回答

12

如果您的应用是一个包装在本地Objective-C应用程序中的Web应用程序,则可以通过操作键盘视图来实现此目的。

首先,注册以接收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];
                    }
                }

            }
        }
    }
}

该方法会遍历屏幕上的视图以查找表单助手并将其隐藏。

注意:苹果可能不会拒绝此方法的使用,因为我已经看到 Facebook 等公司在使用它,但这种技术可能会在即将发布的 iOS 版本中失效。


我将我的应用程序包装在UIWebView中作为最终产品,但到目前为止,我已经完成了所有的“预包装”工作。看起来这可能是解决这个问题的唯一方法。 - ThinkingStiff
使用UIKeyboardWillShowNotification代替UIKeyboardDidShowNotification,这样就不会看到工具栏的出现和消失了... - Besi
你还应该执行 [perView removeFromSuperview];,否则隐藏的视图将会吞噬任何触摸事件,并且不会将它们传递给底层的 UIWebView - Besi
@Besi 错了。因为视图在键盘出现之前没有实例化,所以UIKeyboardWillShowNotification不起作用。 - The dude
1
@Besi 我也试了,它对我也不起作用。顺便说一下,我找到了一个比 @HeziCohen 提出的解决方案更好的版本。可以在这里找到。该解决方案使用 UIKeyboardWillShowNotification 而不是 UIKeyboardDidShowNotification(并且它有效),此外,还消除了表单助手栏移除后剩余的灰色水平线。 - Alexander Poleschuk

5

这些都与移动 Safari 非独立模式有关。这是为了一个无 Chrome 的 Web 应用程序。我希望有更多的控制,但也许没有。 - ThinkingStiff
不幸的是,我不认为您可以通过无界面应用程序来控制它。也许有人会证明我错了。 - seth.miller
iOS 9.3.2有任何更新的解决方案吗?还是仍然不可能? - reectrix

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

2
看起来不错,但我想在 Web 应用程序中实现,而不是本地应用程序。 - ThinkingStiff
非常有趣的解决方案,可以尝试使用方法交换来实现...我会试一试。 - Robert Karl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接