如何从整个应用程序的弹出框中拖动按钮? (迅速)

时间:2018-08-16 04:47:16

标签: ios swift uipangesturerecognizer

在我的应用中,我正在显示一个弹出窗口,该弹出窗口显示一个自定义UIView,允许用户使用各种滑块选择颜色。我还想实现一个“吸管”工具,用户可以点击并按住然后拖动以从应用程序中可见的任何颜色中选择一种颜色。在我的自定义UIView中,我向按钮中添加了UIPanGestureRecognizer,该按钮指向handlePan方法:

var eyedropperStartLocation = CGPoint.zero
@objc func handlePan(recognizer: UIPanGestureRecognizer) {

    // self is a custom UIView that contains my color selection
    // sliders and is placed inside a UITableView that's in
    // the popover.
    let translation = recognizer.translation(in: self)
    if let view = recognizer.view {

        switch recognizer.state {
        case .began:
            eyedropperStartLocation = view.center

        case .ended, .failed, .cancelled:
            view.center = eyedropperStartLocation
            return

        default: break

        }
        view.center = CGPoint(x: view.center.x + translation.x,
                              y: view.center.y + translation.y)
        recognizer.setTranslation(CGPoint.zero, in: self)

    }
}

我可以拖动按钮并更改位置,但是有两个问题:

  1. 吸管按钮并不总是位于其他项目的前面,即使在弹出框内或在弹出框内的自定义UIView上也是如此
  2. 在弹出框的边界之外,吸管按钮消失

如何使按钮始终可见,包括在弹出框之外?我要检测用户在应用程序中放开的位置,以便确定它的颜色。

1 个答案:

答案 0 :(得分:0)

我想出了办法,所以我将回答自己的问题。我创建了一个新的UIImageView并将其添加到应用程序的Window中,而不是在弹出窗口中的视图/按钮周围移动,以使其覆盖整个应用程序。原始按钮保留在原处-您可以轻松更改其状态以使其看起来有所不同,也可以根据需要隐藏它。

您还可以使用Interface Builder绑定到@IBActions,但是我只是用代码完成了所有工作。 clickButton方法可以开始工作,但会计算窗口中的位置并将其显示在屏幕上。 handlePan方法执行翻译,并让您移动它。

下面的所有代码均为swift 4,可在XCode 9.4.1中使用(假设我没有引入任何错字):

{pair['Name']:pair['Value'] for pair in source_list}