Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在Swift中为UIImageView对象分配操作_Ios_Swift_Uiimageview - Fatal编程技术网

Ios 如何在Swift中为UIImageView对象分配操作

Ios 如何在Swift中为UIImageView对象分配操作,ios,swift,uiimageview,Ios,Swift,Uiimageview,当用户点击某个动作时,我正试图为其分配一个UIImageView 我知道如何为UIButton创建动作,但如何模仿UIButton的相同行为,但使用UIImageView?您需要在UIImageView中添加手势识别器(用于点击使用,用于点击并按住使用) let tap = UITapGestureRecognizer(target: self, action: #selector(YourClass.tappedMe)) imageView.addGestureRecognizer(tap)

当用户点击某个动作时,我正试图为其分配一个
UIImageView


我知道如何为
UIButton
创建动作,但如何模仿
UIButton
的相同行为,但使用
UIImageView

您需要在
UIImageView
中添加手势识别器(用于点击使用,用于点击并按住使用)

let tap = UITapGestureRecognizer(target: self, action: #selector(YourClass.tappedMe))
imageView.addGestureRecognizer(tap)
imageView.isUserInteractionEnabled = true
并实现选择器方法,如:

@objc func tappedMe()
{
    println("Tapped on Image")
}

您需要一个
uitappesturerecognizer
。 要设置,请使用以下命令:

override func viewDidLoad()
{
    super.viewDidLoad()

    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
    imageView.isUserInteractionEnabled = true
    imageView.addGestureRecognizer(tapGestureRecognizer)
}

@objc func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
{
    let tappedImage = tapGestureRecognizer.view as! UIImageView

    // Your action
}

(您也可以使用
ui按钮
并为其分配一个图像,无需文本,而只需连接
i操作

您实际上可以将
ui按钮
的图像设置为通常放置在
ui图像视图
中的图像。例如,您将执行以下操作:

myImageView.image = myUIImage
您可以改为使用:

myButton.setImage(myUIImage, forState: UIControlState.Normal)
下面是您的代码的样子:

override func viewDidLoad(){
  super.viewDidLoad()

  var myUIImage: UIImage //set the UIImage here
  myButton.setImage(myUIImage, forState: UIControlState.Normal)
}

@IBOutlet var myButton: UIButton!
@IBAction func buttonTap(sender: UIButton!){
  //handle the image tap
}
使用此方法的好处在于,如果必须从数据库加载图像,可以在设置图像之前设置按钮的标题:

myButton.setTitle("Loading Image...", forState: UIControlState.Normal)

要告诉用户您正在加载图像

,您可以向imageView添加一个
UITapgestureRecognitizer
,只需将其中一个拖动到情节提要/xib中,按住Ctrl键从imageView拖动到GestureRecognitizer,按住Ctrl键从GestureRecognitizer拖动到Swift文件,即可制作一个
iAction

您还需要在
UIImageView
上启用用户交互,如下图所示:

您可以在
UIImageView
上方放置一个透明背景的
UIButton
,并在加载swift 2.0及更高版本的图像之前,聆听按钮上的轻击声,然后执行此操作

@IBOutlet weak var imageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let tap = UITapGestureRecognizer(target: self, action: #selector(ViewController.tappedMe))
        imageView.addGestureRecognizer(tap)
        imageView.userInteractionEnabled = true
    }
    func tappedMe()
    {
        print("Tapped on Image")
    }
Swift 4代码
ViewdidLoad()中的步骤1 步骤2添加以下功能
它经过测试,工作正常Swift4代码

尝试以下一些新的扩展方法:

import UIKit

extension UIView {

    fileprivate struct AssociatedObjectKeys {
        static var tapGestureRecognizer = "MediaViewerAssociatedObjectKey_mediaViewer"
    }

    fileprivate typealias Action = (() -> Void)?


    fileprivate var tapGestureRecognizerAction: Action? {
        set {
            if let newValue = newValue {
                // Computed properties get stored as associated objects
                objc_setAssociatedObject(self, &AssociatedObjectKeys.tapGestureRecognizer, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
            }
        }
        get {
            let tapGestureRecognizerActionInstance = objc_getAssociatedObject(self, &AssociatedObjectKeys.tapGestureRecognizer) as? Action
            return tapGestureRecognizerActionInstance
        }
    }


    public func addTapGestureRecognizer(action: (() -> Void)?) {
        self.isUserInteractionEnabled = true
        self.tapGestureRecognizerAction = action
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTapGesture))
        self.addGestureRecognizer(tapGestureRecognizer)
    }


    @objc fileprivate func handleTapGesture(sender: UITapGestureRecognizer) {
        if let action = self.tapGestureRecognizerAction {
            action?()
        } else {
            print("no action")
        }
    }

}
现在,每当我们想将
uiapgesturecognizer
添加到
UIView
UIView
子类(如
UIImageView
)中时,我们都可以这样做,而无需为选择器创建相关函数

用法:

 profile_ImageView.addTapGestureRecognizer {
        print("image tapped")
    }

我建议在imageview上放置不可见(不透明度=0)按钮,然后在按钮上处理交互。

需要添加lazy以便TapGestureRecognizer注册。
由于UITapGestureRecognitizer(target:self…)中的“self”如果不是惰性变量,则将为零。即使将isUserInteractionEnable设置为true,也不会在没有惰性变量的情况下注册

lazy var imageSelector : UIImageView = {
    let image = UIImageView(image: "imageName.png")
    //now add tap gesture
    image.isUserInteractionEnabled = true
    image.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleImageSelector)))
    return image
}()
@objc private func handleImageSelector() {
    print("Pressed image selector")
}

这就是我发现的,更容易设置

  • 打开库,查找“点击手势识别器”对象
  • 将对象拖动到情节提要,并将代理设置为要触发动作的图像
  • 然后转到视图控制器,拖动同一对象以设置iAction


  • 默认情况下,
    UIImageView
    不响应触摸。您还必须启用用户交互。@rmaddy Oops,没错。编辑。我喜欢使用IB设置,拖放功能强大,没想到这是可能的+1美元。作为一个noob,如果不在故事板上“鼠标移动”,就很容易不知道它是如何连接的。这取决于您的偏好,但我更喜欢“在代码中查看”。挑剔:var tgr=UITapGestureRecognizer(target:self-action:Selector(“imageTapped:”),这两个参数之间需要一个逗号。正如MidHun MP下面所述,请确保在Swift 3.0中有userInteractionEnabled=True操作语法:Selector(“imageTapped:”)更改为操作:#选择器(imageTapped))在Swift 3.0中,userInteractionEnabled属性已使用Swift 4重命名为IsUserInteractionEnabled,这对我来说很有效,但我必须为函数添加一个
    @objc
    修饰符。userInteractionEnabled是关键。@hatim:您面临的问题是什么?如果您有新问题,请将其作为新问题发布。@MidhunMP我正在动态生成图像视图,并且已经完成了此答案中所写的内容,但是tappedMe()函数没有通过以下更改使calledIt为我工作:让tap=UITappestureRecognitor(目标:self,操作:#选择器(ViewController.tappedMe))//下一行->successIndicatorImg.AddgestureRecognitor(点击)//下一行->successIndicatorImg.isUserInteractionEnabled=true@hatim您是否对多个UI视图使用相同的手势?我刚刚解决了这个问题,因为我对多个视图使用了相同的手势,只有一个对我有效。当我创建多个手势时,它对我很有效。这是一种描述选项的快速方式。我以为大家都知道!在没有任何真正原因的情况下添加不必要的UI组件不是一个好主意。这将增加UI的复杂性,并且您必须处理相同的自动布局约束。最好添加一个TapGestureRecognizer.userInteractionEnabled现在已重命名为isUserInteractionEnabledWorks很棒。到目前为止,它大大简化了实现。使用的反射函数让我有点害怕-这在未来的swift版本中是否有很好的机会工作?这非常优雅而且有用。为我工作❤️我喜欢扩展这可以在action:argument中声明函数吗?类似这样的内容:image.addgestureRecognitizer(UITapgestureRecognitizer(目标:self,操作:{print(“ok”)}))
     profile_ImageView.addTapGestureRecognizer {
            print("image tapped")
        }
    
    lazy var imageSelector : UIImageView = {
        let image = UIImageView(image: "imageName.png")
        //now add tap gesture
        image.isUserInteractionEnabled = true
        image.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleImageSelector)))
        return image
    }()
    @objc private func handleImageSelector() {
        print("Pressed image selector")
    }