如何一次只允许触摸一个 UIImageView

How to allow only one UIImageView to be touched at a time

我构建了一个简单的记忆游戏,它由 16 个 UIImageView 组成。

对于记忆游戏,您一次只能摸一张牌。当您触摸卡片时,它会翻转并显示下面的图像

我的问题是我只希望用户一次能够触摸一个图像视图。当用户同时点击两张卡片时,游戏就会出现故障。所以我的问题是如何一次只允许 1 个 UIImageView 执行一个操作,而不允许多个 UIImageView 在同时触摸时同时执行一个操作。

您有多种选择。

您可以在包含所有卡片视图的超级视图上放置一个点击手势识别器,并添加逻辑来确定哪个被点击。由于只有一种方法可以识别水龙头,因此您获得的不会超过一种。

或者,您可以向您的 class 添加一个实例变量来跟踪状态,并使用它在您不想要的图像视图上将 userInteractionEnabled 设置为 false用户点击。

假设用户必须通过再次选择卡片来取消翻转,我建议在您的 viewController 中添加一个 属性 以跟踪 selectedCard。如果已经选择了一张卡片,则忽略所有其他卡片。

var selectedCard: UIImageView?

@objc func handleTap(_ recognizer: UITapGestureRecognizer) {
    guard let imageView = recognizer.view as? UIImageView else { return }
    if let selected = selectedCard {
        if selected === imageView {
            // unflip the card
            imageView.image = backOfCard
            selectedCard = nil
        }
    } else {
        // display face of card
        imageView.image = ...
        selectedCard = imageView
    }
}

注意:即使用户同时点两张卡片,也会连续调用两次handleTap。第一张牌将获胜并被翻转并成为 selectedCard,第二张牌将被忽略,因为 if selected === imageView 测试将失败。