gpt4 book ai didi

objective-c - UIWebView 向下滚动输入焦点仅限 iOS 6

转载 作者:技术小花猫 更新时间:2023-10-29 10:09:52 26 4
gpt4 key购买 nike

我正在模式中加载 UIWebView。该网页有一些输入完全按照 iOS 5 中的预期工作。但是在 iOS 6 中,只要输入获得焦点,键盘就会自动“居中”表单,即使输入有足够的空间显示在上面键盘。由于一些输入位于页面的顶部,这迫使它们不可见,因此用户看不到他们正在输入的内容。向上滚动以查看输入会导致键盘停止工作,直到关闭并重新聚焦输入(然后再次将其滚动到 View 之外)。这是 iOS 6 中的预期行为吗?当输入获得焦点时(如 iOS 5 的工作方式),有什么方法可以防止 webview 滚动吗?

最佳答案

在不了解您代码的内部工作原理的情况下,我将尽力提供帮助。如果不出意外,我希望提供一些思考。你问了两个问题:

这是 iOS6 中的预期行为吗?

您所看到的肯定很奇怪。 webView 将表单居中而不是将输入字段居中,这很奇怪。而且它绝对不应该导致事件输入字段滚出 View 。此外,键盘似乎停止工作,这很奇怪。但是,预计在 iOS 5 和 6 中会出现与 webView 滚动相关的不同行为。如您所说,iOS 5 将 inputField 滚动到 View 中,而 iOS6 将其置于中心。

有什么方法可以防止 webview 在输入获得焦点时滚动(就像 iOS 5 的工作方式一样)?

是的。我在下面提供了执行此操作的代码——即停止 webView 滚动。如果这正是您想要做的,那就太好了。但是,停止 webView 滚动与获得与 iOS5 相同的行为是不一样的。尽管如此,我还是想按照您的要求为您提供此选项。

#import "ViewController.h"

@interface ViewController () <UIScrollViewDelegate> {
CGPoint origin;
}

@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com"]];
[self.webView loadRequest:request];
self.webView.scrollView.delegate = self;

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

// NOTE THAT SIMPLY DISABLING THE SCROLL WILL NOT PREVENT KEYBOARD SCROLL
//[self.webView.scrollView setScrollEnabled:NO];
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

- (void)keyboardWillShow {
NSLog(@"keyboard");
origin = self.webView.scrollView.contentOffset;

}

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
NSLog(@"scroll");
[self.webView.scrollView setContentOffset:origin];
}

@end

如果您想要一致的滚动行为...

我花了一些时间来编写这个滚动修改。您可以使用它作为引用来制作您自己的在 iOS 5 和 6 中保持一致的滚动行为。在这段代码中: 当用户单击网页上的文本输入框时,代码将通过保持页面滚动到其当前位置来停止默认滚动行为。不幸的是,没有办法取消所有滚动,而是你必须覆盖滚动。一旦默认滚动被“抑制”,它就会获取事件输入框的位置并滚动到该位置。这会将事件输入框放在屏幕顶部。您可以根据自己的喜好进行修改。比如你可以使用[UIScrollView scrollRectToVisible]让它更像iOS5。

#import "ViewController.h"

@interface ViewController () <UIScrollViewDelegate> {
CGPoint origin;
CGPoint activeElementOrigin;
BOOL pauseScroll;
}

@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];

NSURLRequest *request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://www.google.com"]];
[self.webView loadRequest:request];
self.webView.scrollView.delegate = self;

pauseScroll = NO;
origin = CGPointZero;

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

- (void)keyboardWillShow {
NSLog(@"keyboard");
pauseScroll = YES;
origin = self.webView.scrollView.contentOffset;
}

- (void)keyboardDidShow {
NSLog(@"keyboard DID SHOW");
pauseScroll = NO;
[self.webView.scrollView setContentOffset:activeElementOrigin animated:YES];
}

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
NSLog(@"scroll");

if (pauseScroll) {
[self.webView.scrollView setContentOffset:origin animated:NO];

NSString *javaScript = [NSString stringWithFormat:@"function f(){ var textField = document.activeElement; return textField.getBoundingClientRect().top; } f();"];
NSString *textFieldRectTop = [self.webView stringByEvaluatingJavaScriptFromString:javaScript];
activeElementOrigin = origin;
activeElementOrigin.y = [textFieldRectTop floatValue]-10;
}
}


@end

如果这段代码对您有帮助,您能将赏金奖励给我就太好了。我将不胜感激。

关于objective-c - UIWebView 向下滚动输入焦点仅限 iOS 6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13071195/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com