সুইফটে ইউআইআইমেজভিউ অবজেক্টের জন্য কীভাবে একটি ক্রিয়া বরাদ্দ করা যায়


186

আমি UIImageViewব্যবহারকারী যখন এটিকে টেপ করি তখন আমি কোনও ক্রিয়াকে একটি বরাদ্দ দেওয়ার চেষ্টা করছি ।

আমি জানি যে কীভাবে একটি ক্রিয়া তৈরি করতে হয় UIButton, তবে আমি কীভাবে একই ব্যবহারের নকল করতে পারি UIButton, তবে একটি ব্যবহার করতে UIImageViewপারি?

উত্তর:


421

আপনি একটি প্রয়োজন হবে UITapGestureRecognizer। সেট আপ করতে এটি ব্যবহার করুন:

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
}

(আপনি এটি ব্যবহার করতে পারেন UIButtonএবং এটিতে কোনও চিত্র নির্ধারণ করতে পারেন পাঠ্য ছাড়াই এবং কেবল কোনও সংযুক্ত করার চেয়ে IBAction)


3
নিতপিক: var tgr = UITapGestureR সনাক্তকারী (লক্ষ্য: স্ব স্ব ক্রিয়া: নির্বাচক ("চিত্রটিযুক্ত:")), দুটি প্যারামিটারের মধ্যে কমা দরকার।
সিছুসার

3
মিডহান এমপি দ্বারা নীচে বর্ণিত হিসাবে, নিশ্চিত হয়ে নিন যে আপনার ব্যবহারকারীর অন্তর্ভুক্তকরণটি কার্যকর হয়েছে = সত্য
শেরাজ

2
সুইফট ৩.০-এ ক্রিয়নের বাক্য গঠন: নির্বাচক ("চিত্রযুক্ত": ") ক্রিয়ায় পরিবর্তিত হয়েছে: # নির্বাচক (চিত্রযুক্ত) (এমিলিপ্যাটেড)
এমিলি

2
সুইফট 3.0.০-তে ব্যবহারকারীর অন্তর্ভুক্তকরণটি সক্ষম করা সম্পত্তিটি পুনরায় নামকরণ করে ব্যবহারকারীর নামকরণ করা হয়েছে
ডগ আমোস

2
সুইফট 4 ব্যবহার করে, এটি আমার পক্ষে কাজ করেছিল, তবে আমাকে @objcফাংশনে একটি পরিবর্তনকারী যুক্ত করতে হয়েছিল।
মার্ক লিয়নস

68

আপনি (পেতে ট্যাপ ব্যবহার এএ অঙ্গভঙ্গি শনাক্তকারী যোগ করতে হবে UITapGestureRecognizer আলতো চাপুন এবং হোল্ড ব্যবহারের জন্য, UILongPressGestureRecognizer আপনার জন্য) UIImageView

let tap = UITapGestureRecognizer(target: self, action: #selector(YourClass.tappedMe))
imageView.addGestureRecognizer(tap)
imageView.isUserInteractionEnabled = true

এবং নির্বাচক পদ্ধতিটি প্রয়োগ করুন:

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

13
ইউজার-ইন্টেরাকশনএনবলড কী।
কেনেস্টাস্ট

@ হাতিম: আপনি যে সমস্যার মুখোমুখি হচ্ছেন তা কী? আপনার যদি নতুন সমস্যা হয় তবে দয়া করে এটি একটি নতুন প্রশ্ন হিসাবে পোস্ট করুন।
মিডহান এমপি

@ মিধুন এমএমপি আমি গতিশীলভাবে চিত্রের ভিউ তৈরি করছি এবং এই উত্তরে যা লেখা হয়েছে ঠিক তেমনই করেছি তবে ট্যাপডমে () ফাংশনটি কল হচ্ছে না
হ্যাটিমে

1
এটি আমার জন্য নিম্নলিখিত পরিবর্তনগুলির সাথে কাজ করেছে: আসুন = UITapGestureRecognizer (টার্গেট: স্ব, ক্রিয়া: # নির্বাচনকারী (ViewController.tapedMe)) // পরবর্তী লাইন -> সাফল্যআইডিকেটরআইএমজি.এডডেস্টেশারআরসিগনাইজার (আলতো চাপুন) // পরবর্তী লাইন -> সাফল্যসন্ধিগ্রহীকরণ আইডিজিটেশনএলড = সত্য
আলিমির ক্যাম্পোস

@ হাতিম আপনি কি একাধিক ইউআই ভিউতে একই অঙ্গভঙ্গি ব্যবহার করছেন? আমি কেবল এই সমস্যাটি সমাধান করেছি কারণ আমি একাধিক দর্শনের জন্য একই অঙ্গভঙ্গিটি ব্যবহার করছিলাম এবং কেবল একজনই আমার পক্ষে কাজ করছিল। যখন আমি একাধিক অঙ্গভঙ্গি তৈরি করি তা আমার পক্ষে কাজ করে।
নাদফাফিফ

36

আপনি UITapGestureRecognizerইমেজভিউতে একটি যুক্ত করতে পারেন , কেবল আপনার স্টোরিবোর্ড / এক্সবিতে একটি টেনে আনুন, চিত্র ভিউ থেকে অঙ্গভঙ্গি সনাক্তকারীকে সিটিআরএল-টেনে আনুন এবং একটি বানাতে ইশারাআর সনাক্তকারী থেকে সিটিআরএল-টেনে আনুন IBAction

UIImageViewএই চিত্রটিতে যেমন দেখানো হয়েছে তেমনভাবে আপনাকে ব্যবহারকারীর ইন্টারঅ্যাকশন সক্ষম করতে হবে : এখানে চিত্র বর্ণনা লিখুন


4
UIImageViewডিফল্টভাবে ছোঁয়া সাড়া দেয় না। আপনাকে ব্যবহারকারীর ইন্টারঅ্যাকশন সক্ষম করতে হবে।
rmaddy

@ আরমড্ডি ওফস, এটি সত্য। সম্পাদনা করা হয়েছে।
এমিল 20

1
আমি পছন্দ করি আপনি কীভাবে এটি আইবি ব্যবহার করে সেট আপ করতে পারেন, টানুন / ড্রপ শক্তিশালী এবং এটি সম্ভব হয়েছে বলে আশা করেননি। তার জন্য +1। একটি নুব হিসাবে, স্টোরবোর্ডটি "আশেপাশে ছড়িয়ে পড়া" না করে এটি কীভাবে সংযুক্ত তা জেনে রাখা সহজ। এটি আপনার পছন্দের উপর নির্ভর করে তবে আমি "কোডটিতে এটি দেখতে" পছন্দ করি।
রাগ করুনআইটিউই

13

দ্রুততম 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")
    }

ইউজার-ইন্টেরাকশনএএনএবলড-এর এখন নামকরণ করা হয়েছে isUserInterationEnabled
চেইম ফ্রেডম্যান

11

সুইফট 4 কোড

এটি কয়েকটি নতুন এক্সটেনশন পদ্ধতি ব্যবহার করে দেখুন:

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")
        }
    }

}

এখন যখনই আমরা UITapGestureRecognizerএকটি UIViewবা UIViewসাবক্লাসের মতো একটি UIImageViewযুক্ত করতে চাই , আমরা নির্বাচকদের জন্য সম্পর্কিত ফাংশন তৈরি না করে এটি করতে পারি!

ব্যবহার:

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

2
দুর্দান্ত কাজ করে। এবং এটি এতদূর পর্যন্ত বাস্তবায়নকে সহজতর করেছে।
নিক এন

ব্যবহৃত প্রতিবিম্ব ফাংশনগুলি আমাকে খানিকটা ভয় দেখায় - ভবিষ্যতের সুইফ্ট সংস্করণগুলিতে এটি কাজ করার কোনও ভাল সুযোগ আছে কি?
কলাআসিড

1
এটি অত্যন্ত মার্জিত এবং সহায়ক। আমার জন্য কাজ করে
টেলর ম্যাক্সওয়েল

2
❤️আমি ভালবাসা এক্সটেনশনস
রিকার্ডো

8

আপনি UIButtonসাধারণত একটিতে সাধারণত যা রাখবেন তার চিত্রটি সেট করতে পারেন UIImageView। উদাহরণস্বরূপ, আপনি যেখানে করবেন:

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)

আপনার চিত্রটি লোড করা হচ্ছে তা আপনার ব্যবহারকারীদের জানাতে


2

ইউটিআইপিপজেচারচারিখুনাইজারে
'স্ব' থেকে যেহেতু রেজিস্ট্রেশন করতে ট্যাপস্টেচাররনগায়জারকে অলস যুক্ত করা দরকার (লক্ষ্য: স্ব ...) যদি এটি কোনও অলস বর্ণ না থাকে তবে তা শূন্য হবে। এমনকি যদি আপনি isUserInterationEnable = সত্য সেট করেন তবে এটি অলস বর্ণ ছাড়া নিবন্ধভুক্ত হবে না।

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")
}

1

আপনি UIButtonউপরে একটি স্বচ্ছ পটভূমি দিয়ে UIImageViewএকটি রাখতে পারেন এবং চিত্রটি লোড করার আগে বোতামে একটি ট্যাপ শুনতে পারেন


1
এটি একটি বিকল্প বর্ণনা করার একটি দ্রুত উপায়। ভেবেছিলাম সবাই এটা জানত!
Deposch ali

3
কোনও আসল কারণ ছাড়াই অপ্রয়োজনীয় ইউআই উপাদান যুক্ত করা ভাল ধারণা নয়। এটি ইউআইয়ের জটিলতা বাড়িয়ে তুলবে এবং একই অটো লেআউট সীমাবদ্ধতার সাথে আপনাকেও মোকাবেলা করতে হবে। এটি একটি ট্যাপস্টেকারআর সনাক্তকারীকে যুক্ত করা আরও ভাল।
গুণহান

1

সুইফট 4 কোড


ভিউডিডলয়েডে প্রথম পদক্ষেপ ()

   let pictureTap = UITapGestureRecognizer(target: self, action: #selector(MyInfoTableViewController.imageTapped))
       userImageView.addGestureRecognizer(pictureTap)
       userImageView.isUserInteractionEnabled = true

পদক্ষেপ 2 নিম্নলিখিত ফাংশন যোগ করুন

@objc func imageTapped() {

        let imageView = userImageView
        let newImageView = UIImageView(image: imageView?.image)
        newImageView.frame = UIScreen.main.bounds
        newImageView.backgroundColor = UIColor.black
        newImageView.contentMode = .scaleAspectFit
        newImageView.isUserInteractionEnabled = true
        let tap = UITapGestureRecognizer(target: self, action: #selector(dismissFullscreenImage))
        newImageView.addGestureRecognizer(tap)
        self.view.addSubview(newImageView)

        self.navigationController?.isNavigationBarHidden = true
        self.tabBarController?.tabBar.isHidden = true

    }

এটি পরীক্ষিত এবং সঠিকভাবে কাজ করছে


0

আমি আপনার ইমেজভিউতে অদৃশ্য (ধাপ্পা

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.