在Swift中,我如何拥有一个具有内部和外部委托的UIScrollView子类?

道格·史密斯

我正在子类化UIScrollView中添加一些功能,例如双击缩放和用于图库目的的image属性。但是为了做图像部分,我的子类必须是它自己的委托并实现viewForZoomingInScrollView

但是,当有人使用我的滚动视图子类时,他们可能还希望获得委托通知,以查看scrollViewDidScroll或了解您的情况。

在Swift中,我如何同时获得这两个?

林太郎

这是此模式的Swift版本:

尽管forwardInvocation:已在Swift中禁用,但我们仍然可以使用forwardingTargetForSelector:

class MyScrollView: UIScrollView {

    class _DelegateProxy: NSObject, UIScrollViewDelegate {
        weak var _userDelegate: UIScrollViewDelegate?

        override func respondsToSelector(aSelector: Selector) -> Bool {
            return super.respondsToSelector(aSelector) || _userDelegate?.respondsToSelector(aSelector) == true
        }

        override func forwardingTargetForSelector(aSelector: Selector) -> AnyObject? {
            if _userDelegate?.respondsToSelector(aSelector) == true {
                return _userDelegate
            }
            else {
                return super.forwardingTargetForSelector(aSelector)
            }
        }

        func viewForZoomingInScrollView(scrollView: MyScrollView) -> UIView? {
            return scrollView.viewForZooming()
        }

        // Just a demo. You don't need this.
        func scrollViewDidScroll(scrollView: MyScrollView) {
            scrollView.didScroll()
            _userDelegate?.scrollViewDidScroll?(scrollView)
        }
    }

    private var _delegateProxy =  _DelegateProxy()

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        super.delegate = _delegateProxy
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        super.delegate = _delegateProxy
    }

    override var delegate:UIScrollViewDelegate? {
        get {
            return _delegateProxy._userDelegate
        }
        set {
            self._delegateProxy._userDelegate = newValue;
            /* It seems, we don't need this anymore.
            super.delegate = nil
            super.delegate = _delegateProxy
            */
        }
    }

    func viewForZooming() -> UIView? {
        println("self viewForZooming")
        return self.subviews.first as? UIView // whatever
    }

    func didScroll() {
        println("self didScroll")
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在模板中,我如何拥有一个柜台?

来自分类Dev

如何在画布中创建一个具有厚度和内部图像的圆角矩形

来自分类Dev

我如何拥有一个WPF TextBlock,其所有字体粗细都具有相同的大小?

来自分类Dev

EfCore 3 和拥有类型在同一个表中,你如何设置拥有的实例

来自分类Dev

我如何拥有一个可以是具有相同方法的任何类的对象?

来自分类Dev

我如何拥有一个<input type = ...属性,该属性随Svelte组件的实例化而变化,同时在反应系统中具有其值?

来自分类Dev

我可以拥有一个对象类型的 ArrayList ,它具有指向 Java 中对象的指针列表吗?

来自分类Dev

嗨,我如何在一个活动中拥有多个图形?(MPAndroid图表)

来自分类Dev

我有一个外部类的对象。如何从中获取内部类的对象?

来自分类Dev

SwiftUI如何拥有下一个和后一个动画?

来自分类Dev

我可以有一个子类的子类吗?如何继承父代和其他子类的特征而没有错误?

来自分类Dev

我可以拥有一个应用程序的两个版本,它们具有不同的 BundleId 和相同的显示名称吗?

来自分类Dev

如何在另一个集合中拥有一个集合?

来自分类Dev

如何在两个文件中拥有一个类和超类(Typescript)

来自分类Dev

如何在两个文件中拥有一个类和超类(Typescript)

来自分类Dev

我如何拥有一个包含多个帖子的登录表单并在烧瓶中获取请求

来自分类Dev

我如何拥有一个表单,在单击输入时,输入中的文本会保留下来?

来自分类Dev

我们应该拥有一个没有外部 IP 的数据库服务器吗?

来自分类Dev

如何拆分测试和培训数据,以使每个班级中至少每个班级拥有至少一个

来自分类Dev

如何在实体框架中拥有一个只有外键的表

来自分类Dev

我如何拥有一个指向计算列的外键?

来自分类Dev

如果我们更改SSH端口,如何拥有一个幂等的Ansible剧本?

来自分类Dev

我如何找出哪个程序“拥有”一个热键?

来自分类Dev

我如何拥有一个非常安全的Ubuntu桌面系统

来自分类Dev

当我有五个具有相同选项和值的选择时,如何从另一个选择标签中删除选定的选项?

来自分类Dev

我可以在ncyBreadcrumb中拥有一个动态的父母吗?

来自分类Dev

swift tableview 委托方法在另一个类中没有响应

来自分类Dev

如何拥有一个干净的* ubuntu和Awesome WM?

来自分类Dev

在同一个应用程序中拥有 firebase 和 AngularFire2

Related 相关文章

  1. 1

    在模板中,我如何拥有一个柜台?

  2. 2

    如何在画布中创建一个具有厚度和内部图像的圆角矩形

  3. 3

    我如何拥有一个WPF TextBlock,其所有字体粗细都具有相同的大小?

  4. 4

    EfCore 3 和拥有类型在同一个表中,你如何设置拥有的实例

  5. 5

    我如何拥有一个可以是具有相同方法的任何类的对象?

  6. 6

    我如何拥有一个<input type = ...属性,该属性随Svelte组件的实例化而变化,同时在反应系统中具有其值?

  7. 7

    我可以拥有一个对象类型的 ArrayList ,它具有指向 Java 中对象的指针列表吗?

  8. 8

    嗨,我如何在一个活动中拥有多个图形?(MPAndroid图表)

  9. 9

    我有一个外部类的对象。如何从中获取内部类的对象?

  10. 10

    SwiftUI如何拥有下一个和后一个动画?

  11. 11

    我可以有一个子类的子类吗?如何继承父代和其他子类的特征而没有错误?

  12. 12

    我可以拥有一个应用程序的两个版本,它们具有不同的 BundleId 和相同的显示名称吗?

  13. 13

    如何在另一个集合中拥有一个集合?

  14. 14

    如何在两个文件中拥有一个类和超类(Typescript)

  15. 15

    如何在两个文件中拥有一个类和超类(Typescript)

  16. 16

    我如何拥有一个包含多个帖子的登录表单并在烧瓶中获取请求

  17. 17

    我如何拥有一个表单,在单击输入时,输入中的文本会保留下来?

  18. 18

    我们应该拥有一个没有外部 IP 的数据库服务器吗?

  19. 19

    如何拆分测试和培训数据,以使每个班级中至少每个班级拥有至少一个

  20. 20

    如何在实体框架中拥有一个只有外键的表

  21. 21

    我如何拥有一个指向计算列的外键?

  22. 22

    如果我们更改SSH端口,如何拥有一个幂等的Ansible剧本?

  23. 23

    我如何找出哪个程序“拥有”一个热键?

  24. 24

    我如何拥有一个非常安全的Ubuntu桌面系统

  25. 25

    当我有五个具有相同选项和值的选择时,如何从另一个选择标签中删除选定的选项?

  26. 26

    我可以在ncyBreadcrumb中拥有一个动态的父母吗?

  27. 27

    swift tableview 委托方法在另一个类中没有响应

  28. 28

    如何拥有一个干净的* ubuntu和Awesome WM?

  29. 29

    在同一个应用程序中拥有 firebase 和 AngularFire2

热门标签

归档