ค้นหาทิศทางของการเลื่อนใน UIScrollView หรือไม่


183

ฉันUIScrollViewอนุญาตให้ใช้การเลื่อนแนวนอนเท่านั้นและฉันต้องการทราบทิศทางของผู้ใช้ (ซ้าย, ขวา) ที่เลื่อน สิ่งที่ฉันทำคือ subclass 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");

    }

}

แต่วิธีนี้บางครั้งก็ไม่ได้รับการเรียกเลยเมื่อฉันย้าย คุณคิดอย่างไร?


ดูคำตอบของฉันด้านล่าง - คุณควรใช้ผู้ได้รับมอบหมายมุมมองเลื่อนเพื่อทำสิ่งนี้
memmons

คำตอบที่ดีที่สุดที่นี่: stackoverflow.com/questions/11262583/ …
iksnae

คำตอบ:


392

การกำหนดทิศทางนั้นค่อนข้างตรงไปตรงมา แต่โปรดจำไว้ว่าทิศทางนั้นสามารถเปลี่ยนแปลงได้หลายครั้งตลอดเส้นทางของท่าทาง ตัวอย่างเช่นหากคุณเปิดมุมมองแบบเลื่อนโดยเปิดใช้งานเพจและผู้ใช้เลื่อนไปที่หน้าถัดไปทิศทางเริ่มต้นอาจเป็นไปทางขวา แต่ถ้าคุณเปิดใช้งานการเด้งกลับ จากนั้นไปทางซ้ายสั้น ๆ

ในการกำหนดทิศทางคุณจะต้องใช้UIScrollView scrollViewDidScrollผู้รับมอบสิทธิ์ ในตัวอย่างนี้ฉันสร้างตัวแปรชื่อlastContentOffsetที่ฉันใช้เพื่อเปรียบเทียบเนื้อหาออฟเซ็ตปัจจุบันกับอันก่อนหน้า หากยิ่งใหญ่แสดงว่า scrollView เลื่อนไปทางขวา ถ้าน้อยกว่า scrollView จะเลื่อนไปทางซ้าย:

// 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.    
}

ฉันใช้ enum ต่อไปนี้เพื่อกำหนดทิศทาง การตั้งค่าแรกเป็น ScrollDirectionNone มีประโยชน์เพิ่มเติมในการกำหนดทิศทางนั้นเป็นค่าเริ่มต้นเมื่อเริ่มต้นตัวแปร:

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

1
ฉันจะหา LastContentOffset ได้อย่างไร
Dev

@JasonZhao Heh - ฉันได้รับผลลัพธ์แปลก ๆ เมื่อฉันทดสอบโค้ดอย่างตั้งใจเพราะฉันไม่ได้คำนึงถึงว่าการตีกลับของ scrollview ทำให้เกิดทิศทางการเลื่อนไปที่ .. er ..bounce ดังนั้นฉันเพิ่มที่ enum เมื่อฉันพบผลลัพธ์ที่ไม่คาดคิด
memmons

1
@Dev มันอยู่ในรหัสlastContentOffset = scrollView.contentOffset.x;
memmons

@ akivag29 จับได้ดีในlastContentOffsetประเภท เกี่ยวกับคุณสมบัติเทียบกับตัวแปรแบบคงที่: การแก้ปัญหาอย่างใดอย่างหนึ่งเป็นทางเลือกที่ดี ฉันไม่มีความชอบที่แท้จริง มันเป็นจุดที่ดี
memmons

2
@JosueEspinosa เพื่อให้ได้ทิศทางการเลื่อนที่ถูกต้องคุณต้องใส่ใน scrollViewWillBeginDragging: เมธอดเพื่อ lastContentOffset setter call
สตรอเบอร์รี่

73

... ฉันต้องการทราบว่าทิศทางใด (ซ้าย, ขวา) ที่ผู้ใช้เลื่อน

ในกรณีนั้นบน iOS 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
อาจเป็นทางออกที่ดีที่สุด แต่ด้วยการเริ่มต้นที่ช้ามาก dx จะเท่ากับ 0
trickster77777

แน่นอนค่ะ นี่ควรเป็นวิธี upvoted มากขึ้นเพราะนี่เป็น "เจ้าของภาษา" หรือวิธีการที่เหมาะสมเป็นหลักเพราะมีความจำเป็นต้องใช้ค่าที่จัดเก็บคุณสมบัติใด ๆ
Michi

นี่ไม่ใช่ปัญหาเดียวกันกับstackoverflow.com/a/26192103/62ซึ่งจะทำงานไม่ถูกต้องเมื่อโมเมนตัมการเลื่อนเริ่มขึ้นหลังจากผู้ใช้หยุดการแพนกล้อง
Liron Yahdav

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
นี่คือจัสตินเพิ่มเติมที่ดี แต่ฉันต้องการเพิ่มการแก้ไขหนึ่งรายการ หาก scrollview ของคุณเปิดใช้งานการเพจและคุณทำการลากที่จะกลับไปที่ตำแหน่งเริ่มต้นเงื่อนไข "else" ปัจจุบันจะพิจารณาว่า "ย้ายไปทางซ้าย" แม้ว่ามันควรจะเป็น "ไม่มีการเปลี่ยนแปลง"
Scott Lieberman

1
@ScottLieberman สิทธิ์ของคุณฉันได้อัปเดตรหัสแล้ว
Justin Tanner

50

ไม่จำเป็นต้องเพิ่มตัวแปรพิเศษเพื่อติดตามสิ่งนี้ เพียงแค่ใช้UIScrollView's 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");
}

คุณสามารถใช้การรวมกันขององค์ประกอบ x และ y เพื่อตรวจจับขึ้นลงซ้ายและขวา


9
น่าเสียดายที่นี่ใช้งานได้ในขณะที่ลาก ความเร็วคือ 0 เมื่อเอาการสัมผัสออกแม้ในขณะที่ยังเลื่อนอยู่
heiko

ดี +1 else part Velocity 0 เนื่องจากผู้ใช้ไม่ได้ลากอีกต่อไปดังนั้นความเร็วของท่าทางคือ 0
Pavan

คุณสามารถจัดเก็บทิศทางในตัวแปร เปลี่ยนเฉพาะเมื่อความเร็ว! = 0 สำหรับฉันทำงาน
Leszek Zarna

ทำงานร่วมกับ scrollViewWillBeginDragging ยอดเยี่ยม
demensdeum

40

การแก้ไขปัญหา

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

1
ให้มันลองกับแทนvelocityInView translationInViewวิธีนี้จะช่วยแก้ปัญหาที่เกิดขึ้นเมื่อเปลี่ยนทิศทางในการเคลื่อนไหวเดียวกัน
enreas

2
โซลูชันนี้ทำงานได้สมบูรณ์แบบ คำตอบที่ยอมรับมากที่สุดไม่ทำงานบางครั้งเมื่อฉันไปที่หน้าจอถัดไปและกลับมาดำเนินการเลื่อนขึ้นและลง
Anjaneyulu Battula

ดีที่สุดขอบคุณ!
Booharin

18

สวิฟท์ 4:

สำหรับการเลื่อนในแนวนอนคุณสามารถทำได้:

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

สำหรับการเลื่อนแนวตั้งเปลี่ยน.xด้วย.y


14

ใน iOS8 Swift ฉันใช้วิธีนี้:

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
ใช้ x แทน y?
Esqarrouth

ที่จริงฉันต้องการตรวจหา UiCollectionView ฉันมีการเลื่อนแนวนอน ดังนั้นฉันจะตรวจจับcrollViewDidEndDeceleratingใช่มั้ย
Umair Afzal

8

นี่คือสิ่งที่มันใช้งานได้สำหรับฉัน (ใน Objective-C):

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

        NSString *direction = ([scrollView.panGestureRecognizer translationInView:scrollView.superview].y >0)?@"up":@"down";
        NSLog(@"%@",direction);
    }

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
วิธีนี้ไม่ได้ถูกเรียกเมื่อค่าของคุณสมบัติ pagingEnabled ของมุมมองเลื่อนคือใช่
Ako

5

หรืออาจสังเกตเส้นทางหลัก "contentOffset" สิ่งนี้มีประโยชน์เมื่อคุณไม่สามารถตั้งค่า / เปลี่ยนผู้รับมอบสิทธิ์ของมุมมองเลื่อน

[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


5

อย่างรวดเร็ว:

    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
    if scrollView.panGestureRecognizer.translation(in: scrollView).y < 0 {
        print("down")
    } else {
        print("up")
    }
}

คุณสามารถทำได้ใน scrollViewDidScroll


4

นี่เป็นวิธีแก้ปัญหาสำหรับพฤติกรรมเช่นใน @followben คำตอบ แต่ไม่มีการสูญเสียกับการเริ่มต้นช้า (เมื่อ dy เป็น 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

ฉันตรวจสอบคำตอบบางส่วนแล้วทำอย่างละเอียดใน AnswerBot คำตอบโดยใส่ทุกอย่างลงในหมวดหมู่ UIScrollView "lastContentOffset" จะถูกบันทึกไว้ใน uiscrollview แทนแล้วมันเป็นเพียงเรื่องของการโทร:

- (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

ฉันชอบกรองบางอย่างตามคำตอบของ @ memmons

ในวัตถุประสงค์ -C:

// 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);

img

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

รหัสอธิบายตัวเองฉันเดา CGFloat Dif1 และ Dif2 ประกาศในอินเทอร์เฟซส่วนตัวคลาสเดียวกัน ดีถ้า contentSize ยังคงเหมือนเดิม

- (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];

    }
}

ดังนั้นนี่จะใช้ textView เพื่อยกเลิกหลังจากการลากสิ้นสุดลง


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

ใช้วิธีการมอบหมายนี้ของ scrollview

หากพิกัดของ y เป็น + ve และมุมมองเลื่อนจะเลื่อนลงและหากเป็น -ve scrollview เลื่อนขึ้นด้านบน ในทำนองเดียวกันการเลื่อนซ้ายและขวาสามารถตรวจจับได้โดยใช้การประสาน x


0

Short & Easy จะเป็นเพียงแค่ตรวจสอบค่าความเร็วถ้ามันมากกว่าศูนย์แล้วเลื่อนไปทางซ้ายขวา:

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

หากคุณทำงานกับ UIScrollView และ UIPageControl วิธีนี้จะเปลี่ยนมุมมองหน้าของ PageControl ด้วย

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

ขอบคุณรหัส Swift ของ @Esq


0

Swift 2.2 ทางออกง่ายๆที่ติดตามทิศทางเดียวและหลายทิศทาง โดยไม่มีการสูญเสีย

  // 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

เมื่อคุณใช้panGestureRecognizerเช่นที่แนะนำ @followben หากคุณไม่ต้องการเลื่อนมุมมองเลื่อนของคุณโดยทางโปรแกรมมันทำงานได้อย่างถูกต้อง

- (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: contentOffset

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 โดยทางโปรแกรมในระหว่างการเลื่อน (เช่นเมื่อคุณต้องการสร้างการเลื่อนแบบไม่มีที่สิ้นสุด) วิธีนี้จะทำให้เกิดปัญหาเนื่องจากคุณอาจเปลี่ยนไป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-scroll-direction-d48a2327a004

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.