swift - 以编程方式创建 UIView 后 slider 没有响应

标签 swift custom-controls uipangesturerecognizer

我以编程方式创建了一个 UIView,并使用 PureLayout 放置了一个 UIImageView init 来约束 UI。

然而,我有一个附加到 UI 的 slider 功能,现在它工作正常,当我决定以编程方式实现 UIView 时, slider 功能不起作用。我不知道为什么,但这就是我能够做的

protocol SwipeDelegate: class {
    func swiped(for view: TripView)
}

class TripView: UIView {

    var shouldSetupConstraints = true
    var startingFrame: CGRect?
    weak var swipeDelegate: SwipeDelegate?

    let screenSize = UIScreen.main.bounds

    let sliderView: UIView = UIImageView(frame: CGRect.zero)
    let sliderImage: UIImageView = UIImageView(frame: CGRect.zero)

    override init(frame: CGRect){
        super.init(frame: frame)

        commonInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        commonInit()
    }

    private func commonInit() {
        sliderView.backgroundColor = UIColor.green
        sliderView.autoSetDimension(.height, toSize: screenSize.width / 6)

        self.addSubview(sliderView)

        sliderImage.backgroundColor = UIColor.clear
        sliderImage.image = UIImage(named: "icons8-double_right_filled.png")
        sliderImage.contentMode = .scaleAspectFit

        sliderImage.autoSetDimension(.width, toSize: screenSize.width / 6)
        sliderImage.autoSetDimension(.height, toSize: screenSize.width / 6)

        self.addSubview(sliderImage)

        swipeFunc()
    }

    override func updateConstraints() {
        if(shouldSetupConstraints) {

            sliderView.autoPinEdgesToSuperviewSafeArea(with: UIEdgeInsets.zero, excludingEdge: .bottom)
            sliderImage.autoPinEdge(toSuperviewEdge: .left)
            sliderImage.autoPinEdge(.bottom, to: .bottom, of: sliderView, withOffset: 0.0)

            shouldSetupConstraints = false
        }

        super.updateConstraints()
    }
}

extension TripView {

    private func swipeFunc() {

        let swipeGesture = UIPanGestureRecognizer(target: self, action: #selector(acknowledgeSwiped(sender:)))
        sliderImage.addGestureRecognizer(swipeGesture)
        sliderImage.isUserInteractionEnabled = true
        swipeGesture.delegate = self as? UIGestureRecognizerDelegate
    }

    @objc func acknowledgeSwiped(sender: UIPanGestureRecognizer) {
        if let sliderView = sender.view {
            let translation = sender.translation(in: sliderView)
            switch sender.state {
            case .began:
                startingFrame = sliderImage.frame
                fallthrough
            case .changed:
                if let startFrame = startingFrame {

                    var movex = translation.x
                    if movex < -startFrame.origin.x { movex = -startFrame.origin.x }

                    let xMax = sliderView.frame.width - startFrame.origin.x - startFrame.width
                    if movex > xMax {
                        movex = xMax
                        swipeDelegate?.swiped(for: self)
                        //                        dismiss(animated: true, completion: nil)
                    }

                    var movey = translation.y
                    if movey < -startFrame.origin.y { movey = -startFrame.origin.y }

                    let yMax = sliderView.frame.height - startFrame.origin.y - startFrame.height
                    if movey > yMax {
                        movey = yMax

                    }

                    sliderView.transform = CGAffineTransform(translationX: movex, y: movey)
                }
            default: // .ended and others:
                UIView.animate(withDuration: 0.1, animations: {
                    sliderView.transform = CGAffineTransform.identity
                })
            }
        }
    }

}

任何帮助将不胜感激

最佳答案

请查看您的实例变量名称,它们在 acknowledgeSwiped() 中被局部变量替换。 保持您的变量名称不同。

@objc func acknowledgeSwiped(sender: UIPanGestureRecognizer) {
    if let sliderView = sender.view {
        let translation = sender.translation(in: self.sliderView) //self.sliderView
        switch sender.state {
        case .began:
            startingFrame = sliderImage.frame
            fallthrough
        case .changed:
            if let startFrame = startingFrame {

                var movex = translation.x
                if movex < -startFrame.origin.x { movex = -startFrame.origin.x }

                let xMax = self.sliderView.frame.width - startFrame.origin.x - startFrame.width //self.sliderView
                if movex > xMax {
                    movex = xMax
                    swipeDelegate?.swiped(for: self)
                    //                        dismiss(animated: true, completion: nil)
                }

                var movey = translation.y
                if movey < -startFrame.origin.y { movey = -startFrame.origin.y }

                let yMax = self.sliderView.frame.height - startFrame.origin.y - startFrame.height //self.sliderView
                if movey > yMax {
                    movey = yMax

                }

                sliderView.transform = CGAffineTransform(translationX: movex, y: movey)
            }
        default: // .ended and others:
            UIView.animate(withDuration: 0.1, animations: {
                sliderView.transform = CGAffineTransform.identity
            })
        }
    }
}

关于swift - 以编程方式创建 UIView 后 slider 没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54645246/

相关文章:

ios - AVSpeechUtterance 和 Swift 中没有语音/语音缺失

ios - 将 UINavigationBar 附加到 UIScrollView 以获得缩小的标题

wpf - WPF-Grid 如何实现 SharedSizeGroup 行为?

multithreading - 从线程内执行 OpenGL 绘图

swift - 为什么我的 gestureRecognizer 返回零?

swift - 为什么不设置 UIView 的边界将其大小限制为这些边界

swift - 为什么可以更改由 let 声明的结构?

ASP.NET 自定义控件 : when is LoadPostData() called?

ios - 在 MKMapview 上移动 MKCircle 并拖动 MKMapview

ios - 仅垂直平移具有弹性效果的 UIView?