使UIImageView可点击并发送到网站

时间:2017-04-11 01:38:14

标签: swift uiimageview

我正在制作UIImageView实例。我无法点击UIImage。我也希望UIImage在点击时将用户发送到互联网上的链接。我怎么能做到这一点?我试过添加轻拍手势等,但没有运气。您可以使用已注释掉的代码查看此内容。

/ 文件1模型文件 /

import Foundation

class Book : NSObject{
    var thumbnailImageName: String?
    var title : String?
    var subTitle : String?
}

/ 文件2单元文件 /

import UIKit

class BookCell: BaseCell{
    var book: Book?{
        didSet{
            thumbnailImageView.image = UIImage(named:  (book?.thumbnailImageName)!)

            titleLabel.text = book?.title

            subtitleTextView.text = book?.subTitle
        }
    }

    var thumbnailImageView: UIImageView = {
        let imageView = UIImageView()

        // let tapGesture = UITapGestureRecognizer(target: imageView, action: #selector(BookCell.tapBlurButton(_:)))

        imageView.image = UIImage(named: "")
        imageView.userInteractionEnabled = true
        imageView.tag = 0
        imageView.contentMode = .ScaleAspectFit
        imageView.clipsToBounds = true
        // imageView.addTarget(self, action: #selector(self.tapBlurButton(_:)), forControlEvents: .TouchUpInside)
        // imageView.addGestureRecognizer(tapGestureRecognizer)
        return imageView
    }()

    let userProfileImageView: UIImageView = {
        let imageView = UIImageView()
        imageView.image = UIImage(named: "Gary Vee Profile Pic 1")
        imageView.layer.cornerRadius = 22
        imageView.layer.masksToBounds = true
        return imageView
    }()

    let separatorView: UIView = {
        let view = UIView()
        view.backgroundColor = UIColor(red: 230/255, green: 230/255, blue: 230/255, alpha: 1)

        return view
    }()

    let titleLabel: UILabel = {
        let label = UILabel()

        label.translatesAutoresizingMaskIntoConstraints = false
        label.text = "DailyVee 199"
        label.userInteractionEnabled = false
        return label
    }()

    let subtitleTextView: UITextView = {
        let textView = UITextView()
        textView.translatesAutoresizingMaskIntoConstraints = false
        textView.text = "When a street hustler make 130 million"
        textView.userInteractionEnabled = false
        textView.textContainerInset = UIEdgeInsetsMake(0,-4,0,0)
        textView.textColor = UIColor.darkGrayColor()
        return textView
    }()

    let purchaseButton: UIButton = {
        let button = UIButton(type: .System) // let preferred over var here
        button.frame = CGRectMake(100, 100, 100, 50)
        button.backgroundColor = UIColor.greenColor()
        button.setTitle("Button", forState: UIControlState.Normal)

        button.addTarget(button, action: #selector(Books.tapBlurButton(_:)), forControlEvents: .TouchUpInside)

        return button
    }()

    override func setupViews(){
        addSubview(thumbnailImageView)
        addSubview(separatorView)
        addSubview(userProfileImageView)
        addSubview(titleLabel)
        addSubview(subtitleTextView)
        addSubview(purchaseButton)

        addContraintsWithFormat("H:|-16-[v0]-16-|", views: thumbnailImageView)

        addContraintsWithFormat("H:|-16-[v0(44)]", views: userProfileImageView)

        //Vertical constraints
        addContraintsWithFormat("V:|-16-[v0]-8-[v1(44)]-16-[v2(1)]|", views: thumbnailImageView, userProfileImageView, separatorView)

        addContraintsWithFormat("H:|[v0]|", views: separatorView)

        //top constraint
        addConstraint(NSLayoutConstraint(item: titleLabel, attribute: .Top, relatedBy: .Equal, toItem: thumbnailImageView, attribute:.Bottom, multiplier: 1, constant: 8))
        //left constraint
        addConstraint(NSLayoutConstraint(item: titleLabel, attribute: .Left, relatedBy: .Equal, toItem: userProfileImageView, attribute:.Right, multiplier: 1, constant: 8))
        //right constraint
        addConstraint(NSLayoutConstraint(item: titleLabel, attribute: .Right, relatedBy: .Equal, toItem: thumbnailImageView, attribute:.Right, multiplier: 1, constant: 0))
        //height constraint
        addConstraint(NSLayoutConstraint(item: titleLabel, attribute: .Height, relatedBy: .Equal, toItem: self, attribute:.Height, multiplier: 0, constant: 20))

        //top constraint
        addConstraint(NSLayoutConstraint(item: subtitleTextView, attribute: .Top, relatedBy: .Equal, toItem: titleLabel, attribute:.Bottom, multiplier: 1, constant: 4))
        //left constraint
        addConstraint(NSLayoutConstraint(item: subtitleTextView, attribute: .Left, relatedBy: .Equal, toItem: userProfileImageView, attribute:.Right, multiplier: 1, constant: 8))
        //right constraint
        addConstraint(NSLayoutConstraint(item: subtitleTextView, attribute: .Right, relatedBy: .Equal, toItem: thumbnailImageView, attribute:.Right, multiplier: 1, constant: 0))
        //height constraint
        addConstraint(NSLayoutConstraint(item: subtitleTextView, attribute: .Height, relatedBy: .Equal, toItem: self, attribute:.Height, multiplier: 0, constant: 30))
    } 
}

/ 文件3类文件 /

class Books : UICollectionViewController, UICollectionViewDelegateFlowLayout {
    var books: [Book] = {
        var askGaryVee = Book()
        askGaryVee.thumbnailImageName = "askgaryvee_book"
        askGaryVee.title = "#ASKGARYVEE: ONE ENTREPRENEUR'S TAKE ON LEADERSHIP, SOCIAL MEDIA, AND SELF-AWARENESS"
        askGaryVee.subTitle = "by Gary Vaynerchuk"

        var jabJabJabRightHook = Book()
        jabJabJabRightHook.thumbnailImageName = "jab_jab_jab_right_hook_book"
        jabJabJabRightHook.title = "JAB, JAB, JAB, RIGHT HOOK: HOW TO TELL YOUR STORY IN A NOISY SOCIAL WORLD"
        jabJabJabRightHook.subTitle = "by Gary Vaynerchuk"

        var theThankYouEconomy = Book()
        theThankYouEconomy.thumbnailImageName = "the_thank_you_economy_book"
        theThankYouEconomy.title = "The Thank You Economy"
        theThankYouEconomy.subTitle = "by Gary Vaynerchuk"

        var crushIt = Book()
        crushIt.thumbnailImageName = "cursh_it_book"
        crushIt.title = "CRUSH IT! WHY NOW IS THE TIME TO CASH IN ON YOUR PASSION"
        crushIt.subTitle = "by Gary Vaynerchuk"

        return[askGaryVee, jabJabJabRightHook, theThankYouEconomy, crushIt]
    }()

    func tapBlurButton(sender: AnyObject) {
        print("Please Help!")
    }

    override func viewDidLoad() {
        self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())

        navigationItem.title = "Books"

        collectionView!.backgroundColor = UIColor.whiteColor()

        collectionView?.registerClass(BookCell.self, forCellWithReuseIdentifier:"cellId")
    }

    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return books.count
    }

    override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cellId", forIndexPath: indexPath) as! BookCell

        cell.book = books[indexPath.item]

        return cell
    }

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
        let height = (view.frame.width - 16 - 16) * 9 / 16
        return CGSizeMake(view.frame.width, height + 16 + 68)
    }

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat {
        return 0
    }

}

2 个答案:

答案 0 :(得分:2)

最简单的解决方案是在UIButton之上添加一个清晰的UIImageView,并将UIButton的框架设置为与UIImageView相同。然后,您可以使用UIButton' IBAction将用户发送到该链接。

var tumbnailButton: UIButton = {
    let button = UIButton(frame: thumbnailImageView.frame)
    button.addTarget(self, action: #selector(tapBlurButton(_:)), for: .touchUpInside)
    button.clipsToBounds = true
    return button
}()

修改 上面的代码可能会抛出一个错误,因为它是一个计算属性。尝试替换

var tumbnailButton: UIButton = {

var tumbnailButton: UIButton {

并删除末尾的括号。

如果这不起作用,请尝试

var tumbnailButton: UIButton {
    get{
        let button = UIButton(frame: thumbnailImageView.frame)
        button.addTarget(self, action: #selector(tapBlurButton(_:)), for: .touchUpInside)
        button.clipsToBounds = true
        return button
    }
}

答案 1 :(得分:0)

创建继承UITapGestureRecognizer

的此类
open class BlockTap: UITapGestureRecognizer {
    fileprivate var tapAction: ((UITapGestureRecognizer) -> Void)?

public override init(target: Any?, action: Selector?) {
    super.init(target: target, action: action)
}

public convenience init (
    tapCount: Int = 1,
    fingerCount: Int = 1,
    action: ((UITapGestureRecognizer) -> Void)?) {
        self.init()
        self.numberOfTapsRequired = tapCount

        #if os(iOS)
        self.numberOfTouchesRequired = fingerCount
        #endif

        self.tapAction = action
        self.addTarget(self, action: #selector(BlockTap.didTap(_:)))
}

open func didTap (_ tap: UITapGestureRecognizer) {
    tapAction? (tap)
}
}

然后对UIImageView或UIView进行扩展

extension UIImageView {
        public func addTapGesture(tapNumber: Int = 1, action: ((UITapGestureRecognizer) -> ())?) {
            let tap = BlockTap(tapCount: tapNumber, fingerCount: 1, action: action)
            addGestureRecognizer(tap)
            isUserInteractionEnabled = true
        }
    }

然后您可以将其用作

imageView?.addTapGesture(action: {[unowned self] (_) in
                //Do whatever on click of image
})

在您的代码中,您可以将其用作

您可以将addTapGesture用于代码中的任何imageview,例如

    let userProfileImageView: UIImageView = {
     let imageView = UIImageView() 
       imageView.image = UIImage(named: "Gary Vee Profile Pic 1") 
       imageView.layer.cornerRadius = 22 
        imageView.layer.masksToBounds = true 
       imageView?.addTapGesture(action: {[unowned self] (_) in
            //Code you want to execute on click of Imageview
            imageView?.cornerRadius = 4.0
            imageView?.clipsToBounds = true
        }) 
          return imageView 
       }()

单击imageView cornerRadius的图像将更改为4.0。