【问题标题】:How to scroll programmatically to a to a line in UIWebView?如何以编程方式滚动到 UIWebView 中的一行?
【发布时间】:2015-05-03 09:09:25
【问题描述】:

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

【问题讨论】:

    标签: javascript html ios objective-c uiwebview


    【解决方案1】:

    和一个客观的 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];
    }
    

    【讨论】:

      【解决方案2】:

      来自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)
      }
      }
      

      但请注意,除非您将其删除,否则您的 NSUserDefaults 值也会在应用启动之间保持不变。

      【讨论】:

      • 我没有尝试,因为安德烈的回答对我有用。感谢您的宝贵时间。
      • 恭喜!!!你的问题已经解决了,没有你没有尝试过的问题,它可能会对其他人有所帮助。
      猜你喜欢
      • 2013-09-01
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2018-03-03
      • 2011-07-04
      相关资源
      最近更新 更多