In Swift, how do I have a UIScrollView subclass that has an internal and external delegate?

后端 未结 4 1908
悲&欢浪女
悲&欢浪女 2020-12-14 11:24

I\'m subclassing UIScrollView to add some features such as double tap to zoom and an image property for gallery purposes. But in order to do the image part my s

4条回答
  •  情深已故
    2020-12-14 11:44

    Swift 4+ version of rintaro's excellent answer:

    class MyScrollView: UIScrollView {
        class _DelegateProxy: NSObject, UIScrollViewDelegate {
            weak var _userDelegate: UIScrollViewDelegate?
    
            override func responds(to aSelector: Selector!) -> Bool {
                return super.responds(to: aSelector) || _userDelegate?.responds(to: aSelector) == true
            }
    
            override func forwardingTarget(for aSelector: Selector!) -> Any? {
                if _userDelegate?.responds(to: aSelector) == true {
                    return _userDelegate
                }
    
                return super.forwardingTarget(for: aSelector)
            }
    
            //This function is just a demonstration, it can be replaced/removed.
            func scrollViewDidScroll(_ scrollView: UIScrollView) {
                (scrollView as? MyScrollView)?.didScroll()
    
                _userDelegate?.scrollViewDidScroll?(scrollView)
            }
        }
    
        fileprivate let _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 {
                _delegateProxy._userDelegate = newValue
            }
        }
    
        func didScroll() {
            print("didScroll")
        }
    }
    

提交回复
热议问题