我有一个UITableViewController,其中有几个部分是动态创建的。每个部分中的一行包含UIWebView作为其accessoryView。 UIWebView预先填充了HTML,以允许编辑其中的文本。当点击UIWebView时,tableView会滚动,以便包含UIWebView的行位于键盘上方;键盘出现,UIWebView成为第一个响应者。如果UIWebView位于tableView的顶部,则此工作正常,因此不需要滚动表。但是,如果点击下方的下行以便必须滚动表,则UIWebView的scrollView的contentInset会发生变化。具体来说,添加了contentInset的底部值,使UIWebView变长而不是矩形。
我上传了截图以显示:
在选择UIWebView之前:
选择UIWebView后:
在UIWebView取消第一响应者状态并且键盘被解除后,它将恢复正常。
我知道正在调整的是contentInset属性,因为我已经使用keyValue" contentInset"添加了webView的scrollView观察者。我可以观察它的变化,甚至然后记录它并确认它已经改变了。
答案 0 :(得分:1)
事实证明问题不在于contentInset,而是UIWebView内置在UIScrollView中的contentOffset。以下是我修复它的方法:
@interface SomeViewController ()
@property BOOL monitorContentOffsetChanges;
@end
@implementation SomeViewController
- (void)webViewCreationMethod {
UIWebView *myWebView = [[UIWebView alloc] init];
//Setup webView
//Observe any changes to the scrollView's contentOffset property
[[webView scrollView] addObserver:self forKeyPath:@"contentOffset" options:0 context:NULL];
[self setMonitorContentOffsetChanges:YES];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
//The webView's contentOffset was changed
if (object == [[self webView] scrollView] && [keyPath isEqualToString:@"contentOffset"] && [self monitorContentOffsetChanges]) {
//Stop responding to changes in the contentOffset to prevent recursive calling of this method
[self setMonitorContentOffsetChanges:NO];
//Force the contentOffset back to zero
[[[self webView] scrollView] setContentOffset:CGPointZero animated:NO];
//Start monitoring changes to the contentOffset again in case of future changes
[self setMonitorContentOffsetChanges:YES];
}
}
@end
此解决方案是必需的,因为UIWebView的scrollView属性是只读的,因此您不能将UIScrollView子类化并覆盖setContentOffset以不采取任何操作并强制将其强制进入UIWebView。
我现在唯一不确定的是这个解决方案是否适用于App Store。