如何以编程方式滚动到 UIWebView 中的一行?

How to scroll programmatically to a to a line in UIWebView?

我想保存用户离开 webView 时的状态(正在加载本地 html 文件),以便下次他进入同一视图时,他会被带到同一行他上次阅读的文字。 我认为这可以通过每次用户滑动文档时将滚动值保存为整数来实现,并且当他下次进入视图时我们使用之前保存的值并使用 javascript 滚动视图命令或 "CG" 东西。 有什么想法吗?

来自Lyndsey Scott's答案:

要保存和检索与 NSUserDefaults 的滚动视图偏移量,请设置您的 UIWebView's 代理并试试这个:

var viewLaidoutSubviews = false // <-- variable to prevent the viewDidLayoutSubviews code from happening more than once

// Save your content offset when the view disappears
override func viewWillDisappear(animated: Bool) {
var userDefaults = NSUserDefaults.standardUserDefaults()
userDefaults.setValue(NSStringFromCGPoint(myBrowser.scrollView.contentOffset), forKey: "scroll_offset")
userDefaults.synchronize()

viewLaidoutSubviews = false
}

// Retrieve and set your content offset when the view re-appears
// and its subviews are first laid out
override func viewDidLayoutSubviews() {

if (!viewLaidoutSubviews) {
    // If a scroll_offset is store in NSUserDefaults, use it
    var userDefaults = NSUserDefaults.standardUserDefaults()
    var scrollOffset:CGPoint? = CGPointFromString(userDefaults.valueForKey("scroll_offset") as? NSString)
    if let position:CGPoint = scrollOffset {
        myBrowser.scrollView.delegate = self
        myBrowser.scrollView.setContentOffset(position, animated: false)
    }
    viewLaidoutSubviews = true
}
}

并利用您的 UIWebView's webViewDidFinishLoad 委托方法更新滚动偏移,以防 Web 视图在视图布局其子视图之前未完成呈现:

// Retrieve and set your content offset once the web view has
// finished rendering (in case it hasn't finished rendering
// by the time the view's subviews were laid out)
func webViewDidFinishLoad(webView: UIWebView) {

// If a scroll_offset is store in NSUserDefaults, use it
var userDefaults = NSUserDefaults.standardUserDefaults()
var scrollOffset:CGPoint? = CGPointFromString(userDefaults.valueForKey("scroll_offset") as? NSString)
if let position:CGPoint = scrollOffset {
    myBrowser.scrollView.delegate = self
    myBrowser.scrollView.setContentOffset(position, animated: true)
}
}

But note, your NSUserDefaults value will also persist between app launches unless you delete it.

和一个objective c解决方案:

@interface ViewController () <UIWebViewDelegate>

@property (weak, nonatomic) IBOutlet UIWebView *webView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://yourwebsite.com"]]];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    if ([userDefaults objectForKey:@"contentOffset"]) {
    webView.scrollView.contentOffset = CGPointFromString([userDefaults objectForKey:@"contentOffset"]);
    }
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    [userDefaults setObject:NSStringFromCGPoint(self.webView.scrollView.contentOffset) forKey:@"contentOffset"];
    [userDefaults synchronize];
}