UITableviewController混淆了可编辑UIWebView的contentInset

时间:2015-01-22 15:59:37

标签: ios objective-c iphone uitableview uiwebview

我有一个UITableViewController,其中有几个部分是动态创建的。每个部分中的一行包含UIWebView作为其accessoryView。 UIWebView预先填充了HTML,以允许编辑其中的文本。当点击UIWebView时,tableView会滚动,以便包含UIWebView的行位于键盘上方;键盘出现,UIWebView成为第一个响应者。如果UIWebView位于tableView的顶部,则此工作正常,因此不需要滚动表。但是,如果点击下方的下行以便必须滚动表,则UIWebView的scrollView的contentInset会发生变化。具体来说,添加了contentInset的底部值,使UIWebView变长而不是矩形。

我上传了截图以显示:

在选择UIWebView之前: Before selecting UIWebView

选择UIWebView后: After selecting UIWebView

在UIWebView取消第一响应者状态并且键盘被解除后,它将恢复正常。

我知道正在调整的是contentInset属性,因为我已经使用keyValue" contentInset"添加了webView的scrollView观察者。我可以观察它的变化,甚至然后记录它并确认它已经改变了。

1 个答案:

答案 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。