LargeTitles UIScrollView 不支持多个观察者实现 _scrollViewWillEndDraggingWithVelocitytarget

swift

1个回答

写回答

wdnmdrnmtq

2025-07-05 00:40

+ 关注

IOS
IOS

UIScrollView是IOS开发中常用的控件之一,用于显示和管理可滚动的内容。它可以滚动显示超出屏幕范围的内容,使用户可以方便地浏览和操作。然而,UIScrollView的一个限制是它不支持多个观察者。这意味着当我们需要在UIScrollView滚动时执行特定的操作时,我们只能使用一个观察者来监听滚动事件。

在UIScrollView的滚动过程中,有一个非常有用的方法,即_scrollViewWillEndDraggingWithVelocity:targetcontentOffset。这个方法在用户拖动UIScrollView并且手指离开屏幕时被调用。它接收两个参数:velocity表示用户松开手指时的滚动速度,targetcontentOffset表示UIScrollView最终停止滚动时的偏移量。

然而,由于UIScrollView不支持多个观察者,我们无法直接在多个地方同时监听这个方法。这给我们的开发带来了一些困扰。不过,我们可以通过一些巧妙的方式来解决这个问题。

首先,我们可以创建一个中间对象来作为UIScrollView的代理。这个中间对象将负责接收UIScrollView的滚动事件,并将其传递给多个观察者。我们可以在中间对象中使用通知、代理或者其他方式来实现这一功能。

接下来,我们可以在观察者对象中注册对中间对象的监听。当中间对象接收到UIScrollView的滚动事件时,它将通知所有的观察者对象。观察者对象可以根据自己的需求来实现_scrollViewWillEndDraggingWithVelocity:targetcontentOffset这个方法,并在其中执行自己的操作。

下面是一个简单的示例代码,演示了如何实现UIScrollView的多个观察者功能:

Swift

// 中间对象

class ScrollViewDelegate: NSObject, UIScrollViewDelegate {

static let shared = ScrollViewDelegate()

var observers: [UIScrollViewDelegate] = []

func addObserver(_ observer: UIScrollViewDelegate) {

observers.append(observer)

}

func removeObserver(_ observer: UIScrollViewDelegate) {

observers = observers.filter { $0 !== observer }

}

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetcontentOffset: UnsafeMutablePointer<CGPoint>) {

for observer in observers {

observer.scrollViewWillEndDragging?(scrollView, withVelocity: velocity, targetcontentOffset: targetcontentOffset)

}

}

}

// 观察者对象

class Observer1: NSObject, UIScrollViewDelegate {

override init() {

super.init()

ScrollViewDelegate.shared.addObserver(self)

}

deinit {

ScrollViewDelegate.shared.removeObserver(self)

}

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetcontentOffset: UnsafeMutablePointer<CGPoint>) {

// 执行观察者1的逻辑

print("Observer1 - scrollViewWillEndDragging")

}

}

class Observer2: NSObject, UIScrollViewDelegate {

override init() {

super.init()

ScrollViewDelegate.shared.addObserver(self)

}

deinit {

ScrollViewDelegate.shared.removeObserver(self)

}

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetcontentOffset: UnsafeMutablePointer<CGPoint>) {

// 执行观察者2的逻辑

print("Observer2 - scrollViewWillEndDragging")

}

}

// 使用示例

let scrollView = UIScrollView()

scrollView.delegate = ScrollViewDelegate.shared

let observer1 = Observer1()

let observer2 = Observer2()

scrollView.setcontentOffset(CGPoint(x: 100, y: 0), animated: true)

这个示例中,我们创建了一个ScrollViewDelegate类作为UIScrollView的代理,并实现了scrollViewWillEndDragging方法。在观察者对象中,我们通过添加和移除ScrollViewDelegate的观察者来注册和取消监听。当UIScrollView滚动时,ScrollViewDelegate会通知所有的观察者对象。

通过这种方式,我们可以在UIScrollView滚动时,同时执行多个观察者的逻辑。这为我们的开发提供了更大的灵活性和可扩展性。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号