আইওএসে বেসিক টেনে আনুন এবং ছাড়ুন


93

আমি এমন একটি দৃশ্য দেখতে চাই যাতে সেখানে গাড়িগুলি গাড়ি চলাচল করে যেগুলি ব্যবহারকারীরাও টেনে টেনে নামতে পারে। এটি করার জন্য সবচেয়ে বড় মাপের কৌশলটি কী বলে আপনি মনে করেন? যানবাহনের প্রতিনিধিত্বকারী দর্শনগুলি থেকে বা বৃহত্তর দর্শন থেকে স্পর্শ ইভেন্টগুলি পাওয়া ভাল? এমন কোনও সাধারণ দৃষ্টান্ত যা আপনি টেনে আনার জন্য ব্যবহার করেছেন যা আপনি সন্তুষ্ট? বিভিন্ন কৌশলগুলির ত্রুটিগুলি কী কী?


উত্তর:


126

ধরে নিন আপনার UIViewপটভূমি চিত্র সহ অনেকগুলি দৃশ্য রয়েছে এবং vehiclesআপনি প্রতিটি নতুন UIButtonযানটিকে একটি হিসাবে সংজ্ঞায়িত করতে পারেন (ইউআইআইমেজভিউ সম্ভবত এটি খুব কার্যকর হবে):

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button addTarget:self action:@selector(imageTouch:withEvent:) forControlEvents:UIControlEventTouchDown];
[button addTarget:self action:@selector(imageMoved:withEvent:) forControlEvents:UIControlEventTouchDragInside];
[button setImage:[UIImage imageNamed:@"vehicle.png"] forState:UIControlStateNormal];
[self.view addSubview:button];

তারপরে আপনি UIControlEventTouchDragInsideইভেন্টটির প্রতিক্রিয়া দিয়ে যেখানেই আপনি যানবাহনটি সরিয়ে নিতে পারেন , যেমন:

- (IBAction) imageMoved:(id) sender withEvent:(UIEvent *) event
{
    CGPoint point = [[[event allTouches] anyObject] locationInView:self.view];
    UIControl *control = sender;
    control.center = point;
}

সামগ্রিকভাবে দৃশ্য পরিচালনা করার সাথে তুলনা করে পৃথক যানবাহনের পক্ষে নিজস্ব ড্র্যাগগুলি পরিচালনা করা অনেক সহজ।


দেখতে দুর্দান্ত এবং খুব সাধারণ! আমি এটি চেষ্টা করে দেখুন।
লুক

10
যদি ব্যবহারকারী অ্যানিমেশন আপডেট হওয়ার চেয়ে দ্রুত বোতামটি টেনে নিয়ে যায় তবে এই কৌশলটি কি টেনে আনার কারণ হবে? যদি তাদের আঙুলটি বাক্সের বাইরে চলে যায় তবে এটি চিত্রটি পাওয়া বন্ধ করে দেবে মোভড: উইথ ইভেন্ট: কল, সঠিক?
টিম

ছবিটি টানাটানি বন্ধ করলে আপনি কীভাবে জানবেন? আপনি কীভাবে জানবেন আঙুলটি সরানো হয়েছে?
ymutlu

ওহো - কোনও চিত্র বা বোতামের জন্য ড্রাগিং "হ্যান্ডেল" অফসেট করা সম্ভব যাতে এটি উপরের ডান বা উপরের বাম কোণে টেনে আনা যায়?
এলজে উইলসন

আমি যখন ব্যতিক্রম হওয়ার চেষ্টা করছি - [ড্রাগ_মোভ_টেক্সটভিউ কনট্রোলার চিত্র: স্পর্শ সহ:]: অপরিচিত চিহ্নিত নির্বাচক 0x4b4b1c0
iosDev

34

ওহহো এর উত্তর ছাড়াও আমি অনুরূপ বাস্তবায়ন চেষ্টা করেছি, তবে "দ্রুত" টানা এবং টানতে কেন্দ্রীকরণের সমস্যা ছাড়াই।

বোতাম সূচনাটি হ'ল ...

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button addTarget:self action:@selector(imageMoved:withEvent:) forControlEvents:UIControlEventTouchDragInside];
[button addTarget:self action:@selector(imageMoved:withEvent:) forControlEvents:UIControlEventTouchDragOutside];
[button setImage:[UIImage imageNamed:@"vehicle.png"] forState:UIControlStateNormal];
[self.view addSubview:button];

এবং পদ্ধতি বাস্তবায়ন:

- (IBAction) imageMoved:(id) sender withEvent:(UIEvent *) event
{
    UIControl *control = sender;

    UITouch *t = [[event allTouches] anyObject];
    CGPoint pPrev = [t previousLocationInView:control];
    CGPoint p = [t locationInView:control];

    CGPoint center = control.center;
    center.x += p.x - pPrev.x;
    center.y += p.y - pPrev.y;
    control.center = center;
}

আমি বলছি না যে এটি উত্তরের সঠিক সমাধান। তবুও আমি এটি টেনে আনার সবচেয়ে সহজ সমাধান খুঁজে পেয়েছি।


4
আপনার উদাহরণ কোডে আপনি ইউআইসিএন্ট্রোল * কন্ট্রোল = প্রেরককে এটির ব্যবহারের পরে সংজ্ঞায়িত করেছেন- এটি কি আগে সংজ্ঞায়িত করা উচিত নয়?
পিটার জনসন

@ পিটার জনসন: আসলে এই ক্ষেত্রে এটি বিবেচ্য নয়। আপনি যে রেখাটি উল্লেখ করেছেন তার পর থেকে এই ভেরিয়েবলের আগের কোনও ব্যবহার নেই :)
জাকুবকেজলিক

4
সিজিপিয়েন্ট পিপ্রেভ সম্পর্কে কী [= পূর্ববর্তী লোকেশনআইভিউ: নিয়ন্ত্রণ]; সিজিপয়েন্ট পয়েন্ট = [টি লোকেশনআইভিউ: নিয়ন্ত্রণ]; এই দুটি পূর্ববর্তী লাইনে উভয়ই "নিয়ন্ত্রণ" হিসাবে উল্লেখ আছে?
পিটার জনসন

হায় হায় ভগবান! আমি কীভাবে এটি মিস করতে পারি? : -ও ... আমি উত্তরটি সম্পাদনা করেছি।
JakubKnejzlik

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

2

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

পরিবর্তে আমি একটি বরং জেনেরিক ড্রাগ ড্রপ সমাধান প্রয়োগ করেছি যা একক বা একাধিক ড্রপ জোনে ব্যবহার করা যেতে পারে।

আমি একটি সাধারণ উদাহরণ তৈরি করেছি যা এখানে দেখা যায়: একাধিক অন্যান্য ইউভিউয়ের মধ্যে একটি ড্রপ ইউভিউগুলি টেনে আনুন

আপনি যদি অন্য পথে যাওয়ার সিদ্ধান্ত নেন তবে ইউইবুটনের পরিবর্তে ইউকন্ট্রোল ব্যবহার করে দেখুন। তারা অ্যাডটারেজ পদ্ধতিগুলি ঘোষণা করে এবং প্রসারিত করা অনেক সহজ - সুতরাং কাস্টম রাষ্ট্র এবং আচরণ দেয়।


1

আমি প্রকৃতপক্ষে বড় দৃশ্যের চেয়ে যানটির দৃশ্যে নিজেকে টেনে আনতে ট্র্যাক করব - যদি না নির্দিষ্ট কারণ না থাকে।

একটি ক্ষেত্রে যেখানে আমি ব্যবহারকারীর আইটেমগুলি স্ক্রিনে টেনে এনে রাখার অনুমতি দিই। যে ক্ষেত্রে আমি উভয় থাকার সঙ্গে পরীক্ষামুলক শীর্ষ দেখুন এবং শিশু মতামত টেনে আনার যোগ্য। আপনি যদি ইউআইভিউতে কয়েকটি "ড্রাগগ্রেবল" মতামত যোগ করেন এবং কীভাবে সেগুলি টেনে আনা যায় সেটিকে হ্যান্ডেল করেন তবে এটির ক্লিনার কোডটি পেয়েছি। নতুন অবস্থানটি উপযুক্ত কিনা উপযুক্ত তা যাচাই করতে আমি প্যারেন্ট ইউআইভিউ-তে একটি সাধারণ কলব্যাক ব্যবহার করেছি - যাতে আমি অ্যানিমেশন দিয়ে নির্দেশ করতে পারি।

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


1
-(void)funcAddGesture
{ 

 // DRAG BUTTON
        UIPanGestureRecognizer *panGestureRecognizer;
        panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(dragButton:)];
        panGestureRecognizer.cancelsTouchesInView = YES;

        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.frame = CGRectMake(50, 100, 60, 60);
        [button addTarget:self action:@selector(buttontapEvent) forControlEvents:UIControlEventPrimaryActionTriggered];
        [button setImage:[UIImage imageNamed:@"button_normal.png"] forState:UIControlStateNormal];
        [button addGestureRecognizer:panGestureRecognizer];
        [self.view addSubview:button];
}


- (void)dragButton:(UIPanGestureRecognizer *)recognizer {

    UIButton *button = (UIButton *)recognizer.view;
    CGPoint translation = [recognizer translationInView:button];

    float xPosition = button.center.x;
    float yPosition = button.center.y;
    float buttonCenter = button.frame.size.height/2;

    if (xPosition < buttonCenter)
        xPosition = buttonCenter;
    else if (xPosition > self.view.frame.size.width - buttonCenter)
        xPosition = self.view.frame.size.width - buttonCenter;

    if (yPosition < buttonCenter)
        yPosition = buttonCenter;
    else if (yPosition > self.view.frame.size.height - buttonCenter)
        yPosition = self.view.frame.size.height - buttonCenter;

    button.center = CGPointMake(xPosition + translation.x, yPosition + translation.y);
    [recognizer setTranslation:CGPointZero inView:button];
}


- (void)buttontapEvent {

    NSLog(@"buttontapEvent");
}

1

ওহো উত্তর আমার জন্য ভাল কাজ করে। আপনার যদি সুইফট ২.x সংস্করণটির প্রয়োজন হয়:

override func viewDidLoad() {

    let myButton = UIButton(type: .Custom)
    myButton.setImage(UIImage(named: "vehicle"), forState: .Normal)

    // drag support
    myButton.addTarget(self, action:#selector(imageMoved(_:event:)), forControlEvents:.TouchDragInside)
    myButton.addTarget(self, action:#selector(imageMoved(_:event:)), forControlEvents:.TouchDragOutside)
}

private func imageMoved(sender: AnyObject, event: UIEvent) {
    guard let control = sender as? UIControl else { return }
    guard let touches = event.allTouches() else { return }
    guard let touch = touches.first else { return }

    let prev = touch.previousLocationInView(control)
    let p = touch.locationInView(control)
    var center = control.center
    center.x += p.x - prev.x
    center.y += p.y - prev.y
    control.center = center
}


0

সুইফট 4 সহজ এবং সহজতম পদ্ধতির জন্য। 😛

পদক্ষেপ 1: কন্ট্রোলার দেখতে স্টোরবোর্ড থেকে আপনার বোতামটি সংযুক্ত করুন। এবং সমস্ত বেসিক অটোলআউট সীমাবদ্ধতা সেট করুন

 @IBOutlet weak var cameraButton: UIButton!

পদক্ষেপ 2: আপনার বোতামটির জন্য প্যান ইশারা যুক্ত করুন দেখুনডিডলোড ()

self.cameraButton.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.panGestureHandler(panGesture:))))

ধাপ 3:

PanGestureHandler যোগ করুন

@objc func panGestureHandler(panGesture recognizer: UIPanGestureRecognizer) {

         let location = recognizer.location(in: view)
        cameraButton.center = location

    }

এবং এখন আপনার বাটন অ্যাকশন

@IBAction func ButtonAction(_ sender: Any) {

        print("This is button Action")
    }

এখানে চিত্র বর্ণনা লিখুন

ফলাফল দেখুন Add যুক্ত করুন

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