কীভাবে ইউআইএলবেলকে ট্যাপের প্রতিক্রিয়া জানাতে হবে?


94

আমি আবিষ্কার করেছি যে আমি ইউআইটিএবেস্টফিল্ডের তুলনায় অনেক দ্রুত ইউআইএলবেল তৈরি করতে পারি এবং আমি আমার ডেটা প্রদর্শন অ্যাপ্লিকেশনটির জন্য বেশিরভাগ সময় ইউআইএলবেল ব্যবহার করার পরিকল্পনা করি।

যদিও একটি দীর্ঘ গল্প সংক্ষিপ্ত করতে, আমি ব্যবহারকারীকে একটি ইউআইএলবেলে ট্যাপ করতে এবং আমার কলব্যাকটি তাতে সাড়া দিতে চাই have এটা কি সম্ভব?

ধন্যবাদ


4
আপনাকে নির্দিষ্ট করতে হবেuserInteractionEnabled = true
onmyway133

উত্তর:


210

আপনি UITapGestureRecognizerআপনার ইউআইএলবেলে একটি উদাহরণ যোগ করতে পারেন ।

উদাহরণ স্বরূপ:

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelTapped)];
tapGestureRecognizer.numberOfTapsRequired = 1;
[myLabel addGestureRecognizer:tapGestureRecognizer];
myLabel.userInteractionEnabled = YES;

14
আহা, এখানে 'ব্যবহারকারীর সংক্ষিপ্তকরণ' বৈশিষ্ট্যটি কী (যেহেতু অন্যান্য কনফিগারেশনটি স্টোরিবোর্ডে পছন্দসইভাবে সেট করা উচিত)। লেবেলের ডিফল্ট ইন্টারঅ্যাকশন বন্ধ করার জন্য যাতে তাদের মাধ্যমে স্পর্শগুলি পাস করতে পারে - তবে এই ক্ষেত্রে তাদের সক্রিয় করার জন্য অঙ্গভঙ্গি সনাক্তকারীকে স্পর্শগুলি পর্যবেক্ষণ করতে হবে। ধন্যবাদ!
মার্চ

4
সুন্দর! আমি কেবল একটি লেবেলে একটি টোকা নিক্ষেপ করছিলাম এবং ব্যবহারকারীর মিথস্ক্রিয়াটিকে সক্ষম করতে ভুলে গিয়েছিলাম। ধন্যবাদ!
মাইক ক্রিচলে

37

আপনি যদি স্টোরিবোর্ড ব্যবহার করছেন তবে আপনি কোনও অতিরিক্ত কোড ছাড়াই স্টোরিবোর্ডে এই পুরো প্রক্রিয়াটি করতে পারেন। স্টোরিবোর্ডে একটি লেবেল যুক্ত করুন, তারপরে লেবেলে একটি টোকা অঙ্গভঙ্গি যুক্ত করুন। ইউটিলিটি ফলসে, নিশ্চিত করুন যে "ব্যবহারকারীর ইন্টারঅ্যাকশন সক্ষম" লেবেলের জন্য পরীক্ষা করা হয়েছে। ট্যাপের অঙ্গভঙ্গি থেকে (স্টোরিবোর্ডে আপনার দৃশ্যের নিয়ামকের নীচে), সিটিআরএল + ক্লিক করুন এবং আপনার ভিউকন্ট্রোল.আর ফাইলটিতে টেনে আনুন এবং একটি ক্রিয়া তৈরি করুন। তারপরে ViewController.m ফাইলে ক্রিয়াটি প্রয়োগ করুন।


স্টোরিবোর্ড ছাড়াই একা ইন্টারফেস বিল্ডার ব্যবহারের পদ্ধতিটিও পাওয়া যায়
গমনো

নিশ্চিত করুন "ব্যবহারকারী মিথস্ক্রিয়া সক্ষমিত" এর অধীনে পরীক্ষা করা হয় দেখুন অধ্যায় আরোপ পরিদর্শক, শুধু অভিগম্যতা বৈশিষ্ট।
সানআর

17

সুইফট 3.0

এর জন্য অঙ্গভঙ্গিটি শুরু করুন tempLabel

tempLabel?.text = "Label"
let tapAction = UITapGestureRecognizer(target: self, action: #selector(self.actionTapped(_:)))
tempLabel?.isUserInteractionEnabled = true
tempLabel?.addGestureRecognizer(tapAction)

অ্যাকশন রিসিভার

func actionTapped(_ sender: UITapGestureRecognizer) {
    // code here
}

সুইফট 4.0

এর জন্য অঙ্গভঙ্গিটি শুরু করুন tempLabel

tempLabel?.text = "Label"
let tapAction = UITapGestureRecognizer(target: self, action:@selector(actionTapped(_:)))
tempLabel?.isUserInteractionEnabled = true
tempLabel?.addGestureRecognizer(tapAction)

অ্যাকশন রিসিভার

func actionTapped(_ sender: UITapGestureRecognizer) {
    // code here
}

প্রেরক অবজেক্ট থেকে লেবেল পাঠ্য কীভাবে পাবেন? অন্য কথায় প্রেরককে কীভাবে চিহ্নিত করব?
ভিনিল 1

সুইফট 4 সংস্করণে # নির্বাচকের পরিবর্তে @ নির্বাচক রয়েছে।
টড

8

সুইফট ২.০:

আমি নমুনা লেবেলের পাঠ্য হিসাবে একটি এনএসএমটেবল স্ট্রিং যুক্ত করছি, ব্যবহারকারীর ইন্টারঅ্যাকশন সক্ষম করে, একটি টোকা অঙ্গভঙ্গি যুক্ত করে একটি পদ্ধতি ট্রিগার করছি।

override func viewDidLoad() {
    super.viewDidLoad()

    let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
    newsString.addAttributes([NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleDouble.rawValue], range: NSMakeRange(4, 4))
    sampleLabel.attributedText = newsString.copy() as? NSAttributedString

    let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "tapResponse:")
    tapGesture.numberOfTapsRequired = 1
    sampleLabel.userInteractionEnabled =  true
    sampleLabel.addGestureRecognizer(tapGesture)

}
func tapResponse(recognizer: UITapGestureRecognizer) {
    print("tap")
}

4

পরিবর্তে আপনি একটি ইউআইবাটন ব্যবহার করতে পারেন এবং যা চান তা পাঠ্য সেট করতে পারেন। আপনি না চাইলে বোতামটি বোতামের মতো দেখতে হবে না


4
এই হিসাবে, আমি সবসময়ই ইউআইবাটনের বাম-ন্যায়সঙ্গত মাল্টি-লাইনের পাঠ্যের সাথে সমস্যায় পড়েছি। এমনকি যখন আমি বাম প্রান্তিককরণটি কেন্দ্রে রেখেছি তখনও এটি ঘটে।
শুভ

আমি ইউআইবাটনকে একবার চেষ্টা করে দেখেছি এবং এটি বেশ সুন্দর। এটি কেবলমাত্র বহু-লাইন বোতাম যা একটি সমস্যা। ধন্যবাদ
শুভ

3

ইউআইএলএবেলে ট্যাপ ইশারা যুক্ত করতে

UITapGestureRecognizer *tapAction = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(lblClick:)];
tapAction.delegate =self;
tapAction.numberOfTapsRequired = 1;

//Enable the lable UserIntraction
lblAction.userInteractionEnabled = YES;
[lblAction addGestureRecognizer:tapAction];   

এবং নির্বাচক পদ্ধতি মূল্যায়ন

- (void)lblClick:(UITapGestureRecognizer *)tapGesture {

}

দ্রষ্টব্য: .h ফাইলে ইউআইজিস্টারআরোকনাইজারডেলিগেট যুক্ত করুন


2

সুইফ্ট সংস্করণ: var tapGesture : UITapGestureRecognizer = UITapGestureRecognizer()

তারপরে ভিতরে viewDidLoad(), এটি যুক্ত করুন:

  let yourLbl=UILabel(frame: CGRectMake(x,y,width,height)) as UILabel!

    yourLbl.text = "SignUp"
    tapGesture.numberOfTapsRequired = 1
    yourLbl.addGestureRecognizer(tapGesture)
    yourLbl.userInteractionEnabled = true
    tapGesture.addTarget(self, action: "yourLblTapped:")

1

আপনি যদি নিজের বোতামে মাল্টি লাইন পাঠ্য ব্যবহার করতে চান UILabelতবে মাল্টলাইন পাঠ্য সহ একটি তৈরি করুন এবং আপনার বোতামে একটি সংক্ষিপ্তসার হিসাবে যুক্ত করুন।

যেমন:

yourLabel=[Uilabel alloc]init];
yourLabel.frame=yourButtom.Frame;//(frame size should be equal to your button's frame)
[yourButton addSubView:yourLabel]

1

অ্যালভিন জর্জের কাছ থেকে সুইফট 3

override func viewDidLoad() {
    super.viewDidLoad()
    let newsString: NSMutableAttributedString = NSMutableAttributedString(string: "Tap here to read the latest Football News.")
    newsString.addAttributes([NSUnderlineStyleAttributeName: NSUnderlineStyle.styleDouble.rawValue], range: NSMakeRange(4, 4))
    sampleLabel.attributedText = newsString.copy() as? NSAttributedString

    let tapGesture: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.tapResponse))
    tapGesture.numberOfTapsRequired = 1
    sampleLabel.isUserInteractionEnabled =  true
    sampleLabel.addGestureRecognizer(tapGesture)
}

func tapResponse(recognizer: UITapGestureRecognizer) {
    print("tap")
}

0

সুইফ্ট সংস্করণটি এর মতো দেখাচ্ছে:

func addGestureRecognizerLabel(){
    //Create a instance, in this case I used UITapGestureRecognizer,
    //in the docs you can see all kinds of gestures
    let gestureRecognizer = UITapGestureRecognizer()

    //Gesture configuration
    gestureRecognizer.numberOfTapsRequired = 1
    gestureRecognizer.numberOfTouchesRequired = 1
    /*Add the target (You can use UITapGestureRecognizer's init() for this)
    This method receives two arguments, a target(in this case is my ViewController) 
    and the callback, or function that you want to invoke when the user tap it view)*/
    gestureRecognizer.addTarget(self, action: "showDatePicker")

    //Add this gesture to your view, and "turn on" user interaction
    dateLabel.addGestureRecognizer(gestureRecognizer)
    dateLabel.userInteractionEnabled = true
}

//How you can see, this function is my "callback"
func showDatePicker(){
    //Your code here
    print("Hi, was clicked")
}

//To end just invoke to addGestureRecognizerLabel() when
//your viewDidLoad() method is called

override func viewDidLoad() {
    super.viewDidLoad()
    addGestureRecognizerLabel()
}

0

আমি ব্যক্তিগতভাবে ইউআইএলবেলের জন্য একটি এক্সটেনশন লেখার পদ্ধতিটি পছন্দ করি। এটিই আমি ব্যবহার করি।

import UIKit

extension UILabel {
    /**
     * A map of actions, mapped as [ instanceIdentifier : action ].
     */
    private static var _tapHandlers = [String:(()->Void)]()

    /**
     * Retrieve the address for this UILabel as a String.
     */
    private func getAddressAsString() -> String {
        let addr = Unmanaged.passUnretained(self).toOpaque()
        return "\(addr)"
    }

    /**
     * Set the on tapped event for the label
     */
    func setOnTapped(_ handler: @escaping (()->Void)) {
        UILabel._tapHandlers[getAddressAsString()] = handler
        let gr = UITapGestureRecognizer(target: self, action: #selector(onTapped))
        gr.numberOfTapsRequired = 1
        self.addGestureRecognizer(gr)
        self.isUserInteractionEnabled = true
    }

    /**
     * Handle the tap event.
     */
    @objc private func onTapped() {
        UILabel._tapHandlers[self.getAddressAsString()]?()
    }
}

তারপরে আপনি এটি কোনও ইউআইএলবেল উদাহরণ থেকে এটি ব্যবহার করতে পারেন:

myLabel.setOnTapped {
    // do something
}

এটি আমার বিশ্বাস হিসাবে কিছু মেমরি ফুটো হওয়ার সম্ভাব্য কারণ হতে পারে, তবে এগুলি সমাধান করার জন্য কীভাবে সেরা তা এখনও নির্ধারণ করতে পারি নি।

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