কোনও ইউআইএসক্রোলভিউতে স্ক্রোলিংয়ের দিক সন্ধান করছেন?


183

আমার কাছে UIScrollViewকেবল অনুভূমিক স্ক্রোলিংয়ের অনুমতি রয়েছে এবং ব্যবহারকারীর স্ক্রোলটি কোন দিক (বাম, ডান) হয় তা জানতে চাই। আমি যা করেছি তা ছিল সাবক্লাস UIScrollViewএবং touchesMovedপদ্ধতিটি ওভাররাইড করা :

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesMoved:touches withEvent:event];

    UITouch *touch = [touches anyObject];
    float now = [touch locationInView:self].x;
    float before = [touch previousLocationInView:self].x;
    NSLog(@"%f %f", before, now);
    if (now > before){
        right = NO;
        NSLog(@"LEFT");
    }
    else{
        right = YES;
        NSLog(@"RIGHT");

    }

}

আমি সরানোর সময় এই পদ্ধতিটি কখনও কখনও ডাকা হয় না। আপনি কি মনে করেন?


নীচে আমার প্রতিক্রিয়া দেখুন - আপনি এটি করতে স্ক্রোল ভিউ প্রতিনিধি ব্যবহার করা উচিত।
স্মরণে

সেরা এখানে উত্তর: stackoverflow.com/questions/11262583/...
iksnae

উত্তর:


392

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

দিকটি নির্ধারণ করতে আপনার UIScrollView scrollViewDidScrollপ্রতিনিধি ব্যবহার করতে হবে । এই নমুনায়, আমি একটি পরিবর্তনশীল নাম তৈরি করেছি lastContentOffsetযা আমি আগের সামগ্রীর সাথে অফসেটের বর্তমান সামগ্রীর তুলনা করতে ব্যবহার করি। যদি এটি আরও বেশি হয় তবে স্ক্রোলভিউটি ঠিক স্ক্রল করছে। যদি এটি কম হয় তবে স্ক্রোলভিউ বামদিকে স্ক্রল করছে:

// somewhere in the private class extension
@property (nonatomic, assign) CGFloat lastContentOffset;

// somewhere in the class implementation
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    ScrollDirection scrollDirection;

    if (self.lastContentOffset > scrollView.contentOffset.x) {
        scrollDirection = ScrollDirectionRight;
    } else if (self.lastContentOffset < scrollView.contentOffset.x) {
        scrollDirection = ScrollDirectionLeft;
    }

    self.lastContentOffset = scrollView.contentOffset.x;

    // do whatever you need to with scrollDirection here.    
}

আমি দিকনির্ধারণ করতে নিম্নলিখিত এনাম ব্যবহার করছি। স্ক্রোলডাইরেক্টননে প্রথম মান নির্ধারণের সাথে ভেরিয়েবলগুলি আরম্ভ করার সময় কোনও দিকনির্দেশকে ডিফল্ট করে তোলার অতিরিক্ত সুবিধা রয়েছে:

typedef NS_ENUM(NSInteger, ScrollDirection) {
    ScrollDirectionNone,
    ScrollDirectionRight,
    ScrollDirectionLeft,
    ScrollDirectionUp,
    ScrollDirectionDown,
    ScrollDirectionCrazy,
};

1
আমি কীভাবে শেষ কনটেন্ট অফসেট পেতে পারি
দেব

@ জেসনজাও হেহ - কোডটি অভ্যন্তরীণভাবে পরীক্ষা করার সময় আমি কিছু অদ্ভুত ফলাফল পাচ্ছিলাম কারণ আমি বিবেচনায় নিইনি যে স্ক্রোলভিউ বাউন্স স্ক্রোলের দিকটি..অর..বাউন করে causes সুতরাং, যখন আমি অপ্রত্যাশিত ফলাফল পেয়েছি তখন আমি এটিকে এনামে যুক্ত করেছি।
স্মারক

1
@ ডেভ এটি কোডে রয়েছেlastContentOffset = scrollView.contentOffset.x;
স্মরণে রাখবে

@ akivag29 ধরণের ভাল ধরুন lastContentOffset। সম্পত্তি বনাম স্থিতিশীল ভেরিয়েবল সম্পর্কিত: উভয় সমাধানই ভাল পছন্দ। আমার কোন সত্যিক পছন্দ নেই। এটি একটি ভাল পয়েন্ট।
স্মারক

2
@ জোসিউস্পিনোসা সঠিক স্ক্রোলের দিকনির্দেশ পেতে, আপনি এটিকে স্ক্রোলভিউবিলবিগিনড্রেগিংয়ে রেখেছেন: মেথড অব কন্টেন্টঅফসেট সেটার কল।
স্ট্রাউনট

73

... আমি জানতে চাই যে কোন দিকটি (বাম, ডান) ব্যবহারকারীর স্ক্রোল রয়েছে।

সেক্ষেত্রে, আইওএস 5 এবং ততোধিক ক্ষেত্রে, UIScrollViewDelegateব্যবহারকারীর প্যান ইশারার দিকটি নির্ধারণ করতে ব্যবহার করুন :

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{ 
    if ([scrollView.panGestureRecognizer translationInView:scrollView.superview].x > 0) {
        // handle dragging to the right
    } else {
        // handle dragging to the left
    }
}

1
সেরা সমাধান হতে পারে, তবে সত্যিই ধীর শুরু দিয়ে, ডেক্সটি 0 এর সমান হবে
ট্রিকস্টারস 77777

অবশ্যই এটি। এটি আরও বেশি উপায়ে উত্সাহিত করা উচিত কারণ এটি আরও একটি "নেটিভ" বা সঠিক উপায় কারণ মূলত কোনও সম্পত্তি-সঞ্চিত মান ব্যবহার করার প্রয়োজন রয়েছে।
মিচি

এটির স্ট্যাকওভারফ্লো.com/a/26192103/62 এর মতো একই সমস্যা নেই যেখানে ব্যবহারকারী প্যানিং বন্ধ করার পরে গতিবেগ স্ক্রোলিং কিক করে একবার এটি সঠিকভাবে কাজ করবে না?
লিরন ইয়াহদাভ

59

scrollViewDidScroll:বর্তমান দিকনির্দেশ খোঁজার জন্য ব্যবহার করা একটি ভাল উপায়।

আপনি যদি ব্যবহারকারীটি স্ক্রোলিং শেষ করার পরে দিকটি জানতে চান তবে নিম্নলিখিতটি ব্যবহার করুন:

@property (nonatomic) CGFloat lastContentOffset;

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {

    self.lastContentOffset = scrollView.contentOffset.x;
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

    if (self.lastContentOffset < scrollView.contentOffset.x) {
        // moved right
    } else if (self.lastContentOffset > scrollView.contentOffset.x) {
        // moved left
    } else {
        // didn't move
    }
}

3
এটি জাস্টিন একটি দুর্দান্ত সংযোজন, তবে আমি একটি সম্পাদনা যুক্ত করতে চাই। যদি আপনার স্ক্রোলভিউতে পৃষ্ঠাটি সক্ষম করা থাকে এবং আপনি এমন একটি টানা সঞ্চালন করেন যা এর প্রারম্ভিক অবস্থানে ফিরে যায় তবে বর্তমান "অন্য" শর্তটি "কোনও পরিবর্তন" না হওয়া সত্ত্বেও "বাম দিকে সরানো" বিবেচনা করবে।
স্কট লাইবারম্যান

1
@ স্কটলিবারম্যান আপনার অধিকার, আমি সেই অনুযায়ী কোড আপডেট করেছি।
জাস্টিন ট্যানার

50

এটি ট্র্যাক রাখতে অতিরিক্ত ভেরিয়েবল যুক্ত করার দরকার নেই। ঠিক UIScrollViewএর panGestureRecognizerমতো সম্পত্তি ব্যবহার করুন । দুর্ভাগ্যক্রমে, এটি কেবল তখনই কাজ করে যখন বেগ 0:

CGFloat yVelocity = [scrollView.panGestureRecognizer velocityInView:scrollView].y;
if (yVelocity < 0) {
    NSLog(@"Up");
} else if (yVelocity > 0) {
    NSLog(@"Down");
} else {
    NSLog(@"Can't determine direction as velocity is 0");
}

আপনি এক্স এবং y উপাদানগুলির সংমিশ্রণটি নীচে, বাম এবং ডান সনাক্ত করতে ব্যবহার করতে পারেন।


9
দুর্ভাগ্যক্রমে এটি টেনে আনার সময় কেবল কাজ করে। স্পর্শ যখন সরানো হয় তখনও বেগ 0 হয়, এমনকি এখনও স্ক্রল করার সময়ও।
হাইকো

ভাল +1। অন্য অংশ বেগ 0 কারণ, ব্যবহারকারী আর টেনে আনছেন না, তাই অঙ্গভঙ্গির বেগ 0
প্যাভান

আপনি দিক পরিবর্তন করতে পারেন। কেবল তখনই পরিবর্তন করুন যখন গতিবেগ! = 0. আমার জন্য কাজ করে
লেসিজাক জারনা

স্ক্রোলভ্যুইলবেইনড্রেইগিংয়ের সাথে কাজ করে, দুর্দান্ত
ডিজেনসডিয়াম

40

সমাধান

func scrollViewDidScroll(scrollView: UIScrollView) {
     if(scrollView.panGestureRecognizer.translationInView(scrollView.superview).y > 0)
     {
         print("up")
     }
    else
    {
         print("down")
    } 
}

1
এর velocityInViewপরিবর্তে চেষ্টা করে দেখুন translationInView। এটি একই আন্দোলনে দিক পরিবর্তন করার সাথে সাথে উদ্ভূত সমস্যার সমাধান করে।
enreas

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

সেরা, ধন্যবাদ!
বুহারিন

17

সুইফট 4:

অনুভূমিক স্ক্রোলিংয়ের জন্য আপনি সহজভাবে এটি করতে পারেন:

if scrollView.panGestureRecognizer.translation(in: scrollView.superview).x > 0 {
   print("left")
} else {
   print("right")
}

এর সাথে উল্লম্ব স্ক্রোলিং পরিবর্তনের .xজন্য.y


14

আইওএস 8 সুইফটে আমি এই পদ্ধতিটি ব্যবহার করেছি:

override func scrollViewDidScroll(scrollView: UIScrollView){

    var frame: CGRect = self.photoButton.frame
    var currentLocation = scrollView.contentOffset.y

    if frame.origin.y > currentLocation{
        println("Going up!")
    }else if frame.origin.y < currentLocation{
        println("Going down!")
    }

    frame.origin.y = scrollView.contentOffset.y + scrollHeight
    photoButton.frame = frame
    view.bringSubviewToFront(photoButton)

}

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

এখানে বিকল্প পদ্ধতিও রয়েছে:

func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    if targetContentOffset.memory.y < scrollView.contentOffset.y {
        println("Going up!")
    } else {
        println("Going down!")
    }
}

1
Y এর পরিবর্তে x ব্যবহার করবেন?
এসক্রারোথ

আসলে আমি এটি ইউআইক্লিকেশনভিউয়ের জন্য সনাক্ত করতে চাই। আমার অনুভূমিক স্ক্রোলিং রয়েছে। সুতরাং আমি ঠিক সনাক্ত করতে হবে crollViewDidEndDecelerating?
উমাইর আফজাল


7
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {

    CGPoint targetPoint = *targetContentOffset;
    CGPoint currentPoint = scrollView.contentOffset;

    if (targetPoint.y > currentPoint.y) {
        NSLog(@"up");
    }
    else {
        NSLog(@"down");
    }
}

2
যখন স্ক্রোল ভিউয়ের পৃষ্ঠাগুলি সম্পাদনযোগ্য সম্পত্তিটির মান হ্যাঁ হয় তখন এই পদ্ধতিটি বলা হয় না।
আকো

5

বিকল্পভাবে, মূল পথ "কন্টেন্টঅফসেট" পর্যবেক্ষণ করা সম্ভব। আপনার পক্ষে যখন স্ক্রোল দর্শনের প্রতিনিধি সেট / পরিবর্তন করা সম্ভব না হয় তখন এটি কার্যকর হয়।

[yourScrollView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil];

পর্যবেক্ষক যুক্ত করার পরে, আপনি এখন করতে পারেন:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    CGFloat newOffset = [[change objectForKey:@"new"] CGPointValue].y;
    CGFloat oldOffset = [[change objectForKey:@"old"] CGPointValue].y;
    CGFloat diff = newOffset - oldOffset;
    if (diff < 0 ) { //scrolling down
        // do something
    }
}

প্রয়োজনে পর্যবেক্ষককে অপসারণ করতে ভুলবেন না। যেমন আপনি পর্যবেক্ষক যোগ করতে পারিনি viewWillAppear এবং এটি অপসারণ viewWillDisappear



4

@ ফলোবেন উত্তরের মতো আচরণের জন্য আমার সমাধান এখানে, তবে ধীর সূচনা দিয়ে ক্ষতি ছাড়াই (যখন ডাই 0 হয়)

@property (assign, nonatomic) BOOL isFinding;
@property (assign, nonatomic) CGFloat previousOffset;

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    self.isFinding = YES;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (self.isFinding) {
        if (self.previousOffset == 0) {
            self.previousOffset = self.tableView.contentOffset.y;

        } else {
            CGFloat diff = self.tableView.contentOffset.y - self.previousOffset;
            if (diff != 0) {
                self.previousOffset = 0;
                self.isFinding = NO;

                if (diff > 0) {
                    // moved up
                } else {
                    // moved down
                }
            }
        }
    }
}

1

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

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
  [scrollView setLastContentOffset:scrollView.contentOffset];
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
  if (scrollView.scrollDirectionX == ScrollDirectionRight) {
    //Do something with your views etc
  }
  if (scrollView.scrollDirectionY == ScrollDirectionUp) {
    //Do something with your views etc
  }
}

Https://github.com/tehjord/UIScrollViewScrollingDirection এ উত্স কোড


1

আমি @ মেমনসের উত্তরের ভিত্তিতে কিছু ফিল্টারিং করতে পছন্দ করি

উদ্দেশ্য-সি তে:

// in the private class extension
@property (nonatomic, assign) CGFloat lastContentOffset;

// in the class implementation
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    if (fabs(self.lastContentOffset - scrollView.contentOffset.x) > 20 ) {
        self.lastContentOffset = scrollView.contentOffset.x;
    }

    if (self.lastContentOffset > scrollView.contentOffset.x) {
        //  Scroll Direction Left
        //  do what you need to with scrollDirection here.
    } else {
        //  omitted 
        //  if (self.lastContentOffset < scrollView.contentOffset.x)

        //  do what you need to with scrollDirection here.
        //  Scroll Direction Right
    } 
}

পরীক্ষিত হলে - (void)scrollViewDidScroll:(UIScrollView *)scrollView:

NSLog(@"lastContentOffset: --- %f,   scrollView.contentOffset.x : --- %f", self.lastContentOffset, scrollView.contentOffset.x);

চিত্র

self.lastContentOffset খুব দ্রুত পরিবর্তন হয়, মান ব্যবধানটি প্রায় 0.5f।

এটি র কোন দরকার নাই.

এবং মাঝেমধ্যে, যখন সঠিক অবস্থায় পরিচালনা করা হয়, তখন আপনার অরিয়েন্টেশনটি হারিয়ে যেতে পারে। (বাস্তবায়নের বিবৃতি কখনও কখনও এড়ানো যায়)

যেমন :

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{

    CGFloat viewWidth = scrollView.frame.size.width;

    self.lastContentOffset = scrollView.contentOffset.x;
    // Bad example , needs value filtering

    NSInteger page = scrollView.contentOffset.x / viewWidth;

    if (page == self.images.count + 1 && self.lastContentOffset < scrollView.contentOffset.x ){
          //  Scroll Direction Right
          //  do what you need to with scrollDirection here.
    }
   ....

সুইফ্ট 4 এ:

var lastContentOffset: CGFloat = 0

func scrollViewDidScroll(_ scrollView: UIScrollView) {

     if (abs(lastContentOffset - scrollView.contentOffset.x) > 20 ) {
         lastContentOffset = scrollView.contentOffset.x;
     }

     if (lastContentOffset > scrollView.contentOffset.x) {
          //  Scroll Direction Left
          //  do what you need to with scrollDirection here.
     } else {
         //  omitted
         //  if (self.lastContentOffset < scrollView.contentOffset.x)

         //  do what you need to with scrollDirection here.
         //  Scroll Direction Right
    }
}

0

যখন পেজিং চালু থাকে, আপনি এই কোডগুলি ব্যবহার করতে পারেন।

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    self.lastPage = self.currentPage;
    CGFloat pageWidth = _mainScrollView.frame.size.width;
    self.currentPage = floor((_mainScrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
    if (self.lastPage < self.currentPage) {
        //go right
        NSLog(@"right");
    }else if(self.lastPage > self.currentPage){
        //go left
        NSLog(@"left");
    }else if (self.lastPage == self.currentPage){
        //same page
        NSLog(@"same page");
    }
}

0

কোডগুলি নিজেই ব্যাখ্যা করে আমার ধারণা। সিজিফ্লোট ডিফারেন্স 1 এবং ডিফারেন্স 2 একই শ্রেণীর ব্যক্তিগত ইন্টারফেসে ঘোষণা করা হয়েছে। কন্টেন্টসাইজ একই থাকলে ভাল।

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
        {

        CGFloat contentOffSet = scrollView.contentOffset.y;
        CGFloat contentHeight = scrollView.contentSize.height;

        difference1 = contentHeight - contentOffSet;

        if (difference1 > difference2) {
            NSLog(@"Up");
        }else{
            NSLog(@"Down");
        }

        difference2 = contentHeight - contentOffSet;

       }

0

ঠিক আছে তাই আমার জন্য এই বাস্তবায়ন সত্যিই ভাল কাজ করছে:

@property (nonatomic, assign) CGPoint lastContentOffset;


- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    _lastContentOffset.x = scrollView.contentOffset.x;
    _lastContentOffset.y = scrollView.contentOffset.y;

}


- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

    if (_lastContentOffset.x < (int)scrollView.contentOffset.x) {
        // moved right
        NSLog(@"right");
    }
    else if (_lastContentOffset.x > (int)scrollView.contentOffset.x) {
        // moved left
        NSLog(@"left");

    }else if (_lastContentOffset.y<(int)scrollView.contentOffset.y){
        NSLog(@"up");

    }else if (_lastContentOffset.y>(int)scrollView.contentOffset.y){
        NSLog(@"down");
        [self.txtText resignFirstResponder];

    }
}

সুতরাং এটি টেক্সটভিউকে টেনে আনার পরে বরখাস্ত করতে পাঠাবে


0
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
NSLog(@"px %f py %f",velocity.x,velocity.y);}

স্ক্রোলভিউয়ের এই প্রতিনিধি পদ্ধতিটি ব্যবহার করুন।

বেগের y এর সমন্বয়টি যদি + স্ক্রোল ভিউটি নীচের দিকে থাকে এবং তা যদি হয়-স্ক্রোলভিউ উপরের দিকে স্ক্রোল হয়। একইভাবে বাম এবং ডান স্ক্রোলটি এক্স কো-অর্ডিনেট ব্যবহার করে সনাক্ত করা যায়।


0

সংক্ষিপ্ত এবং সহজ হবে, কেবল বেগের মানটি পরীক্ষা করুন, যদি এটি শূন্যের চেয়ে বেশি হয় তবে এর স্ক্রোলিং অন্যদিকে বামে রইল:

func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {

    var targetOffset = Float(targetContentOffset.memory.x)
    println("TargetOffset: \(targetOffset)")
    println(velocity)

    if velocity.x < 0 {
        scrollDirection = -1 //scrolling left
    } else {
        scrollDirection = 1 //scrolling right
    }
}

0

আপনি যদি ইউআইএসক্রোলভিউ এবং ইউআইপেজকন্ট্রোল নিয়ে কাজ করেন তবে এই পদ্ধতিটি পৃষ্ঠা নিয়ন্ত্রণের পৃষ্ঠার দৃশ্যকেও পরিবর্তন করবে।

  func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {

    let targetOffset = targetContentOffset.memory.x
    let widthPerPage = scrollView.contentSize.width / CGFloat(pageControl.numberOfPages)

    let currentPage = targetOffset / widthPerPage
    pageControl.currentPage = Int(currentPage)
}

ধন্যবাদ @ এসকেউ এর সুইফট কোড।


0

সুইফট ২.২ সাধারণ সমাধান যা কোনও ক্ষতি ছাড়াই একক এবং একাধিক দিকনির্দেশ করে

  // Keep last location with parameter
  var lastLocation:CGPoint = CGPointZero

  // We are using only this function so, we can
  // track each scroll without lose anyone
  override func scrollViewWillBeginDragging(scrollView: UIScrollView) {
    let currentLocation = scrollView.contentOffset

    // Add each direction string
    var directionList:[String] = []

    if lastLocation.x < currentLocation.x {
      //print("right")
      directionList.append("Right")
    } else if lastLocation.x > currentLocation.x {
      //print("left")
      directionList.append("Left")
    }

    // there is no "else if" to track both vertical
    // and horizontal direction
    if lastLocation.y < currentLocation.y {
      //print("up")
      directionList.append("Up")
    } else if lastLocation.y > currentLocation.y {
      //print("down")
      directionList.append("Down")
    }

    // scrolled to single direction
    if directionList.count == 1 {
      print("scrolled to \(directionList[0]) direction.")
    } else if directionList.count > 0  { // scrolled to multiple direction
      print("scrolled to \(directionList[0])-\(directionList[1]) direction.")
    }

    // Update last location after check current otherwise,
    // values will be same
    lastLocation = scrollView.contentOffset
  }

0

সমস্ত উচ্চতর উত্তরে সমস্যাটি সমাধানের দুটি প্রধান উপায় হ'ল ব্যবহার করা panGestureRecognizerবা contentOffset। উভয় পদ্ধতির তাদের বোধ এবং উপকারিতা রয়েছে।

পদ্ধতি 1: প্যানগ্যাসচাররনোকনাইজার

আপনি যখন panGestureRecognizer@ ফলোবেইনের পরামর্শ মতো করে ব্যবহার করেন , আপনি যদি প্রোগ্রামক্রমে নিজের স্ক্রোল ভিউ স্ক্রোল করতে না চান, এটি সঠিকভাবে কাজ করে।

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{ 
    if ([scrollView.panGestureRecognizer translationInView:scrollView.superview].x > 0) {
        // handle dragging to the right
    } else {
        // handle dragging to the left
    }
}

কনস

তবে আপনি যদি নীচের কোড সহ স্ক্রোল ভিউটি সরান, উপরের কোড এটি সনাক্ত করতে পারে না:

setContentOffset(CGPoint(x: 100, y: 0), animation: false)

পদ্ধতি 2: কন্টেন্টঅফসেট

var lastContentOffset: CGPoint = CGPoint.zero

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if (self.lastContentOffset.x > scrollView.contentOffset.x) {
        // scroll to right
    } else if self.lastContentOffset.x < scrollView.contentOffset.x {
        // scroll to left
    }
    self.lastContentOffset = self.scrollView.contentOffset
}

কনস

আপনি যদি কন্টেন্টঅফসেটটিকে প্রোগ্রামলিকভাবে পরিবর্তন করতে চান, স্ক্রোল চলাকালীন (যেমন আপনি যখন অসীম স্ক্রোল তৈরি করতে চান), এই পদ্ধতিটি সমস্যা তৈরি করে, কারণ আপনি contentOffsetবিষয়বস্তু দর্শন স্থানগুলি পরিবর্তন করার সময় পরিবর্তন করতে পারেন এবং এই সময়ে, উপরের কোডের ঝাঁপ যে আপনি ডানদিকে স্ক্রোল করেন বা পড়ে থাকবে।


0
//Vertical detection
    var lastVelocityYSign = 0
            func scrollViewDidScroll(_ scrollView: UIScrollView) {
                let currentVelocityY =  scrollView.panGestureRecognizer.velocity(in: scrollView.superview).y
                let currentVelocityYSign = Int(currentVelocityY).signum()
                if currentVelocityYSign != lastVelocityYSign &&
                    currentVelocityYSign != 0 {
                    lastVelocityYSign = currentVelocityYSign
                }
                if lastVelocityYSign < 0 {
                    print("SCROLLING DOWN")
                } else if lastVelocityYSign > 0 {
                    print("SCOLLING UP")
                }
            }

Mos6y থেকে উত্তর https://medium.com/@Mos6yCanSwift/swift-ios-determine-scrol-direction-d48a2327a004

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