当前位置: 首页 > 编程笔记 >

Swift 使用 Observe 监测页面滚动的实现方法

戚高洁
2023-03-14
本文向大家介绍Swift 使用 Observe 监测页面滚动的实现方法,包括了Swift 使用 Observe 监测页面滚动的实现方法的使用技巧和注意事项,需要的朋友参考一下

Swift 以前是通过addObserver来实现对某个属性的变化监听,而最新的变化,书写起开更加方便。

observer = test.observe(\.field, options: [.new, .initial]) { (object, change) in
   print(change)
  }

一定要用属性赋值当前的 observe 结果,没有的话可能会造成 change 不生效。

对 UIScrollView 的滚动监听,我们可以使用UIScrollViewDelegate

extension UIScrollViewDelegate{
 func scrollViewDidScroll(scrollView: UIScrollView){
  //do something
 }
}

这里推荐使用 Observe 比较方便的是可以进行模块的逻辑的拆分,我们只需在自己的组件里面进行监听

class ComponetView: UIVIew {
	private var observation: NSKeyValueObservation?
	init(targetView: UIView) {
		observation = targetView.observe(\.contentOffset, options: [.new]) { [weak self] scrollView, change in
   // handle data contentOffset
  }
	}
}

附录:Swift中实现Observable机制

今天给别人讲个Observable的实现和使用场景,结合Observable-Swiftgithub:https://github.com/slazyk/Observable-Swift讲了半天貌似还没有特别明白,故写了个简易的实现,讲述了下Observable属性监控机制。

//: Playground - noun: a place where people can play

import UIKit
import Foundation

// MARK: - Observable
class Observable<T> {
  // 定义block结构
  typealias Observer = T -> Void

  // 申明一个block,用于数据改变的执行
  private var observer: Observer?

  // 数据发生变更,则通过observer告知
  var value: T {
    didSet {
      observer?(value)
    }
  }

  init(_ v: T) {
    value = v
  }

  func observe(observer: Observer?) {
    self.observer = observer
    observer?(value)
  }
}

// MARK: - People
struct PeopleModel {
  let firstName: Observable<String>
  let lastName: Observable<String>

  init(firstName: String, lastName: String) {
    self.firstName = Observable(firstName)
    self.lastName = Observable(lastName)
  }
}

// MARK: - Test

// test1
let people = PeopleModel(firstName: "sunny", lastName: "liu")
people.firstName.observe {
  newValue in
  print("firstName changed: \(newValue)")
}
people.lastName.observe {
  print("lastName changed: \($0)")
}
people.firstName.value = "sunny2"
people.lastName.value = "liu2"

// test2
class House {
  let lableHouseName = UILabel()

  init() {

  }

  var people: PeopleModel? {
    didSet {
      people?.firstName.observe{
        [unowned self] in
        self.lableHouseName.text = $0
      }
    }
  }
}

这样貌似容易理解了,O(∩_∩)O哈哈~

总结

到此这篇关于Swift 使用 Observe 监测页面滚动的文章就介绍到这了,更多相关Swift 使用 Observe 监测页面滚动内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 本文向大家介绍vue监听滚动事件实现滚动监听,包括了vue监听滚动事件实现滚动监听的使用技巧和注意事项,需要的朋友参考一下 在vue中实现滚动监听和原生js无太大差异,下面是一个简单的demo,可在控制台查看结果 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!

  • 问题内容: 我目前正在使用Selenium(Python中的Firefox驱动程序)对滚动进行硬编码,它是否可以在页面上平滑地上下滚动?当页面中的图像加载时,页面可以比正常增长20倍。 我需要上下滚动多次,而不丢失页面的任何部分。 当前方法效率不高,有时无法滚动到页面的某些部分。以下是我当前的代码 问题答案: 如果在Python中使用Selenium,则可以使用它… 或类似的规定。您可以添加刹车来

  • 本文向大家介绍vue移动端监听滚动条高度的实现方法,包括了vue移动端监听滚动条高度的实现方法的使用技巧和注意事项,需要的朋友参考一下 这两天做移动端项目遇到的问题,就是当滚动条下拉到一定的高度的时候,让某个东西固定定位到顶部 首先做的如何监听滚动条的高度,下面是我写的方法 console.log(1); }else{ _this.gofixed = true }},true)我的这个方法是应用v

  • 我为Android原生应用程序编写了自动测试,并被迫解决了滚动问题。 我需要滚动Android应用程序页面,并谷歌下一个方法:http://appium.io/docs/en/commands/interactions/touch/scroll/ 但在第一行我得到了一个例外“java.lang.ClassCastException:io.appium.java_client.android.And

  • 本文向大家介绍bootstrap监听滚动实现头部跟随滚动,包括了bootstrap监听滚动实现头部跟随滚动的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了bootstrap监听滚动头部跟随滚动的实现方法,供大家参考,具体内容如下 实现案例 css控制样式 js监听 导入js 知识只有共享才能传播,才能推崇出新的知识,才能学到更多,这里写的每一篇文字/博客,基本都是从网上查询了一下资料

  • 本文向大家介绍js实现分享到随页面滚动而滑动效果的方法,包括了js实现分享到随页面滚动而滑动效果的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js实现分享到随页面滚动而滑动效果的方法。分享给大家供大家参考。具体如下: 页面向上向下滚动,分享到的模块随着滑动。 要点: 获得页面垂直居中的位置   上代码: 希望本文所述对大家的javascript程序设计有所帮助。