ios - UITableviewController 与可编辑 UIWebView 的 contentInset 混淆

标签 ios objective-c iphone uitableview uiwebview

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

我已经上传了屏幕截图来展示这一点:

选择 UIWebView 之前: Before selecting UIWebView

选择UIWebView后: After selecting UIWebView

UIWebView退出第一响应者状态,键盘dismiss后,恢复正常。

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

最佳答案

原来问题不是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 安全。

关于ios - UITableviewController 与可编辑 UIWebView 的 contentInset 混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28093221/

相关文章:

objective-c - 使用 removeObject 安全吗 : during enumerateObjectsUsingBlock:?

ios - 代码在模拟器中运行,在设备上运行时抛出 dyld symbol not found 错误(Xcode 6 beta)

xcode - 您如何管理 UINavigationController View 中的事件以切换 View ?

ios - 在类之间将 UIImage 分配给 UIImageView

ios - 如何在 UIViewController 中添加自定义 subview 的多个实例

ios - Sprite 套件 : How to add scene on top of running scene

iphone - 带有实时数据的 UITableView 同时也有用户交互

iphone - 如何编写上下文来绘制多页 PDF?

ios - 将 UIView 添加回 View

ios - 使用CoreData是否可以在同一线程上具有多个上下文?