滚动时如何在UIScrollView中向一个方向移动

用户3797431

我是Objective-C的新手。我创建UIScrollView对象并使用以下代码添加到我的视图中:

height = self.view.frame.size.height;
width = self.view.frame.size.width;

scrollbar = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, width, height)];
scrollbar.delegate = self;
scrollbar.backgroundColor = [UIColor whiteColor];
scrollbar.maximumZoomScale = 1.0;
scrollbar.minimumZoomScale = 1.0;
scrollbar.clipsToBounds = YES;
scrollbar.showsHorizontalScrollIndicator = YES;
scrollbar.pagingEnabled = YES;
[scrollbar setContentSize:CGSizeMake(width*4, height*4)];
[self.view addSubview:scrollbar];

for (int i = 1; i <= 4; i++) {
    first = [[FirstViewController alloc]initWithNibName:@"FirstViewController" bundle:nil];
    first.view.frame = CGRectMake((i-1)*width, 0, width, height*4);
    [scrollbar addSubview:first.view];

    switch (i) {
          ase 1:
              first.view.backgroundColor = [UIColor blueColor];
              break;
          case 2:
              first.view.backgroundColor = [UIColor redColor];
              break;
          case 3:
              first.view.backgroundColor = [UIColor greenColor];
              break;
          case 4:
              first.view.backgroundColor = [UIColor grayColor];
              break;
          default:
              break;
        }
    }

在我的代码中,我现在想在ScrollView中添加4种不同颜色的视图,当我在ScrollView上滚动时,想要检测dx和dy(dx:Axis.x上的行驶距离,而dy:Axis.y上的行驶距离)并检查这两个变量,并什么时候 :

Notic:我想在ScrollView上的任一触摸和Axis(x或y)上的移动触摸或在Both Axis(x和y)上的触摸上进行检查时:

如果(dx> dy)禁用水平滚动并沿垂直方向移动!!!否则在水平方向移动并禁用垂直滚动!!!

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

    CGRect visibleRect = CGRectMake(scrollView.contentOffset.x, scrollView.contentOffset.y, scrollView.contentOffset.x + scrollView.bounds.size.width, scrollView.contentOffset.y + scrollView.bounds.size.height);

    NSLog(@"%f,%f",visibleRect.origin.x,visibleRect.origin.y);

    /*NSLog(@"x : %f",scrollView.contentOffset.x);
    NSLog(@"y : %f",scrollView.contentOffset.y);*/
    if (fabsf(scrollView.contentOffset.x) > fabsf(scrollView.contentOffset.y)) {
        NSLog(@"Vertical Side");
    }
    else {
        NSLog(@"Horizontal Side");
    }
}

请指导我。我不能禁用一侧并移动另一侧!!!谢谢

杠杆

您可以实现想要将一些代码添加到委托中的结果。这是我的ViewController.m档案 -viewDidLoad#import语句和其他方法被省略。

@interface ViewController () {
    CGPoint initialOffset;
    NSInteger direction; // 0 undefined, 1 horizontal, 2 vertical
}
@end

@implementation ViewController

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    // retrieve current offset
    CGPoint currentOffset = scrollView.contentOffset;

    // do we know which is the predominant direction?
    if (direction == 0) {

        // no.

        CGFloat dx = currentOffset.x - initialOffset.x;
        CGFloat dy = currentOffset.y - initialOffset.y;

        // we need to decide in which direction we are moving

        if (fabs(dx) >= fabs(dy)) {
            direction = 1; // horizontal
        } else if (fabs(dy) > fabs(dx)) {
            direction = 2;
        }

    }

    // ok now we have the direction. update the offset if necessary
    if (direction == 1 && currentOffset.y != initialOffset.y) {

        // remove y offset
        currentOffset.y  = initialOffset.y;
        // update
        [scrollView setContentOffset:currentOffset];

    } else if (direction == 2 && currentOffset.x != initialOffset.x) {

        currentOffset.x = initialOffset.x;
        [scrollView setContentOffset:currentOffset];

    }
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    // store the current offset
    initialOffset = scrollView.contentOffset;

    // reset flag
    direction = 0; // AKA undefined
}

@end

当您开始拖动时,委托会将标志重置direction为“未知”状态,并存储当前内容偏移量。每次拖动动作后,您的-scrollViewDidScroll:名字就会被调用。在那里,您确定哪个方向是主要方向(如果尚未完成),然后通过删除x(或y)偏移量来相应地校正当前滚动偏移量。

我使用您提供的相同设置对此进行了测试,只是我使用了UIImageView内部结构,UIScrollView并通过InterfaceBuilder进行了所有设置,但是应该可以正常工作。从理论上讲,使用此方法可以替换directionLock,但是请记住,-scrollViewDidScroll在操作期间多次调用该方法,并且每次重写内容偏移量时(如果在两个方向上都发生滚动)。因此,如果保持directionLock启用状态,则可以保存setContentOffset:委托执行的许多调用

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在CSS中仅向一个方向滚动?

来自分类Dev

jQuery可调整大小的方向向一个方向移动,并删除滚动条

来自分类Dev

重新加载和向一个方向滚动tableview时,应用崩溃

来自分类Dev

Unity 对象在统一播放预览中只向一个方向移动

来自分类Dev

CLLocationManager沿直线向一个方向移动

来自分类Dev

JSplitPane只向一个方向移动

来自分类Dev

如何将节点向另一个节点的方向移动

来自分类Dev

您如何使节点永远向一个方向移动?

来自分类Dev

使用自动布局时如何使UIScrollView仅在一个方向上缩放

来自分类Dev

在Android中滚动页面时如何在画布上显示上一个路径?

来自分类Dev

如何在具有相反滚动方向的 uiscrollview 中添加子 uiscrollview?

来自分类Dev

如何在PyQt中创建一个滚动区域

来自分类Dev

播放器对象向一个方向移动但转向了另一个方向

来自分类Dev

如何在将文件移动到Java中的另一个目录时为文件指定新名称?

来自分类Dev

如何在Pygame中使一个圆从一个角向另一个角斜移动

来自分类Dev

jQuery可调整大小的一个方向移动,并删除滚动条

来自分类Dev

如何在单击时使元素移动到另一个元素,然后返回到JQuery中的上一个位置?

来自分类Dev

如何在一个方向上移动立方体3秒钟,然后在相反的方向上移动3秒,或者

来自分类Dev

给移动的物体一个方向

来自分类Dev

如何在另一个游戏对象Unity3D的前移方向上移动游戏对象

来自分类Dev

如何在鼠标移动到另一个图时更新一个图?

来自分类Dev

jQuery如何在单击另一个事件时禁用滚动事件

来自分类Dev

如何在滚动页面时制作一个“流血”图像的 div

来自分类Dev

如何在同一个<option>元素中混合RTL和LTR文本方向?

来自分类Dev

使用方向向量在一个方向上移动对象

来自分类Dev

如何在我的代码中自由移动另一个 div 中的 div 元素?

来自分类Dev

在Android中单击ImageView时如何从一个片段移动到另一个片段?

来自分类Dev

如何在 RecyclerView 中显示下一个和上一个数据设置水平滚动

来自分类Dev

如何在$(window).scroll()中滚动一次有另一个滚动命令

Related 相关文章

  1. 1

    如何在CSS中仅向一个方向滚动?

  2. 2

    jQuery可调整大小的方向向一个方向移动,并删除滚动条

  3. 3

    重新加载和向一个方向滚动tableview时,应用崩溃

  4. 4

    Unity 对象在统一播放预览中只向一个方向移动

  5. 5

    CLLocationManager沿直线向一个方向移动

  6. 6

    JSplitPane只向一个方向移动

  7. 7

    如何将节点向另一个节点的方向移动

  8. 8

    您如何使节点永远向一个方向移动?

  9. 9

    使用自动布局时如何使UIScrollView仅在一个方向上缩放

  10. 10

    在Android中滚动页面时如何在画布上显示上一个路径?

  11. 11

    如何在具有相反滚动方向的 uiscrollview 中添加子 uiscrollview?

  12. 12

    如何在PyQt中创建一个滚动区域

  13. 13

    播放器对象向一个方向移动但转向了另一个方向

  14. 14

    如何在将文件移动到Java中的另一个目录时为文件指定新名称?

  15. 15

    如何在Pygame中使一个圆从一个角向另一个角斜移动

  16. 16

    jQuery可调整大小的一个方向移动,并删除滚动条

  17. 17

    如何在单击时使元素移动到另一个元素,然后返回到JQuery中的上一个位置?

  18. 18

    如何在一个方向上移动立方体3秒钟,然后在相反的方向上移动3秒,或者

  19. 19

    给移动的物体一个方向

  20. 20

    如何在另一个游戏对象Unity3D的前移方向上移动游戏对象

  21. 21

    如何在鼠标移动到另一个图时更新一个图?

  22. 22

    jQuery如何在单击另一个事件时禁用滚动事件

  23. 23

    如何在滚动页面时制作一个“流血”图像的 div

  24. 24

    如何在同一个<option>元素中混合RTL和LTR文本方向?

  25. 25

    使用方向向量在一个方向上移动对象

  26. 26

    如何在我的代码中自由移动另一个 div 中的 div 元素?

  27. 27

    在Android中单击ImageView时如何从一个片段移动到另一个片段?

  28. 28

    如何在 RecyclerView 中显示下一个和上一个数据设置水平滚动

  29. 29

    如何在$(window).scroll()中滚动一次有另一个滚动命令

热门标签

归档