Yet*_*i42 15 objective-c uiwebview ios ios6
我正在以模态加载UIWebView.该网页有一些输入完全按照预期在iOS 5中工作.但是在iOS 6中,只要输入获得焦点,键盘就会自动"对齐"表单,即使输入有足够的空间显示在上面键盘.由于某些输入位于页面顶部,因此会强制它们退出视图,因此用户无法看到他们正在键入的内容.向上滚动以查看输入会导致键盘停止工作,直到被解除并重新聚焦输入(然后再将其滚出视图).这是iOS 6中的预期行为吗?当输入获得焦点时(如iOS 5的工作方式),有没有办法阻止webview滚动?
Ed *_*hin 11
在不知道代码的内部工作原理的情况下,我会尽可能地帮助你.如果不出意外,我希望能提供一些思考的食物.你问了两个问题:
它是iOS6中的预期行为吗?
你所看到的确实很奇怪.令人奇怪的是,webView使表单居中,而不是以输入字段为中心.它绝对不应该导致活动输入字段滚出视图.此外,键盘似乎停止工作,这是非常奇怪的.但是,对于webView滚动,预计会在iOS 5和6中看到不同的行为.正如你所说,iOS 5将inputField滚动到视图中,而iOS6将它放在中心位置.
当输入获得焦点时(如iOS 5的工作方式),有没有办法阻止webview滚动?
是.我提供了下面的代码 - 即阻止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
Run Code Online (Sandbox Code Playgroud)
如果你想要一致的滚动行为......
我花了一些时间来编写这个滚动修改代码.您可以使用它作为参考,使您自己的滚动行为在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
Run Code Online (Sandbox Code Playgroud)
如果这段代码对你有所帮助,那么奖励我的赏金将是非常好的.我会谦卑地感激.
归档时间: |
|
查看次数: |
4288 次 |
最近记录: |