与UISwitch一起锁定两个scrollviews

时间:2011-05-06 17:51:11

标签: iphone switch-statement scrollview

我正在寻求一些帮助。我通常很擅长找到我需要的东西,但这个很棘手。

这是我的测试应用程序的场景:我有2个滚动视图,它们是1024x85,它们只是水平移动。我下面还有一个UISwitch。在滚动视图上方,我有两个标签,显示每个滚动视图移动时的内容偏移量(所以我可以看到发生了什么)。

我想要做的事情:在用户将每个视图左右滑动后,我想使用UISwitch将这些滚动视图锁定在一起,无论他们坐在哪里。

这是更新的代码:

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

 CGPoint p = scrollOne.contentOffset;
 CGPoint r = scrollTwo.contentOffset;

 // Print the contentOffset labels
 scrollOneLabel.text = [NSString stringWithFormat:@"%.2f", p.x];
 scrollTwoLabel.text = [NSString stringWithFormat:@"%.2f", r.x];


// If lock is on, the distance between offsets is locked (but limited to max and min)
if (lockSwitch.on) {

    NSInteger offset = scrollOne.contentOffset.x - scrollTwo.contentOffset.x;

    if (scrollView == scrollOne) {

        NSInteger maxOffset = scrollTwo.contentSize.width - scrollTwo.frame.size.width;
        [scrollTwo setContentOffset: CGPointMake(MIN(MAX(0.0,scrollOne.contentOffset.x - offset), maxOffset), 0.0)];

    } else if (scrollView == scrollTwo) {
        NSInteger maxOffset = scrollOne.contentSize.width - scrollOne.frame.size.width;
        [scrollOne setContentOffset: CGPointMake(MIN(MAX(0.0,scrollTwo.contentOffset.x + offset), maxOffset), 0.0)];
    }
}

// If the lock is not on, both move independently
}

它将滚动视图锁定在一起,但是一旦我移动其中一个滚动视图,第二个滚动视图就跳转到与第一个相同的内容偏移。我试图将它们锁定在那个时刻,而不是在用户触摸其中一个时将它们排成一行。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

所以基本上你想保持两者之间的偏差不变吗?在这种情况下,你需要一个变量,让我们称之为offset,这将是scrollOne.contentOffset.x - scrollTwo.contentOffset.x并且在锁定之后它们只是对委托方法作出反应

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // If lock is on, the distance between offsets is locked (but limited to max and min)
    if (lockSwitch.on) {
         if (scrollView == scrollOne) {
             NSInteger maxOffset = scrollTwo.contentSize.width - scrollTwo.frame.size.width;
             [scrollTwo setContentOffset: CGPointMake(MIN(MAX(0.0,scrollOne.contentOffset.x - offset), maxOffset), 0.0)];
         } else if (scrollView == scrollTwo) {
             NSInteger maxOffset = scrollOne.contentSize.width - scrollOne.frame.size.width;
             [scrollOne setContentOffset: CGPointMake(MIN(MAX(0.0,scrollTwo.contentOffset.x + offset), maxOffset), 0.0)];
         }
    }

    // If the lock is not on, both move independently
}

编辑:您必须在UISwitch更改状态时设置偏移,而不是在每个滚动事件上设置。使用[addTarget:selector:forControlEvents:]方法将此类内容绑定到您的UISwitch。请记住,偏移量必须是您班级中的全局变量。

- (void)lockChanged:(id)sender {
    UISwitch *lock = sender;
    if (lock.on) {
        offset = (int)(scrollOne.contentOffset.x - scrollTwo.contentOffset.x);
    } else {
        offset = 0;
    }
}