UIWebView Keyboard - избавление от панели «Предыдущий / Следующий / Готово» - PullRequest
18 голосов
/ 21 января 2010

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

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

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

Ответы [ 9 ]

10 голосов
/ 14 марта 2012
- (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 /

5 голосов
/ 19 января 2013

Это дополнение к ответу Юна. На iOS 6 (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];
                }
            }
        }
    }
}
4 голосов
/ 31 мая 2012

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

@interface UIWebBrowserView : UIView
@end

@interface UIWebBrowserView (UIWebBrowserView_Additions)
@end

@implementation UIWebBrowserView (UIWebBrowserView_Additions)

- (id)inputAccessoryView {
    return nil;
}

@end
2 голосов
/ 29 августа 2013

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

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

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

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

1 голос
/ 13 декабря 2013

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

- (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];
                }
            }
        }
    }
}
1 голос
/ 02 мая 2012

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

1 голос
/ 21 января 2010

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

0 голосов
/ 03 октября 2011
[[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

0 голосов
/ 21 января 2010

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

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

...