Iphone 使用UISwitch将两个滚动视图锁定在一起

Iphone 使用UISwitch将两个滚动视图锁定在一起,iphone,switch-statement,scrollview,Iphone,Switch Statement,Scrollview,我在找人帮忙。我通常很擅长找到我需要的东西,但这个很棘手 下面是我的测试应用程序的场景:我有两个滚动视图,它们是1024x85,并且只水平移动。我在它们下面还有一个开关。在scrollview上方,我有两个标签,显示每个scrollview移动时的内容偏移量,这样我就可以看到发生了什么 我想做的是:在用户将每个视图左右滑动后,我想使用UISwitch将这些滚动视图锁定在一起,无论它们位于何处 这是更新的代码: - (void)scrollViewDidScroll:(UIScrollView *

我在找人帮忙。我通常很擅长找到我需要的东西,但这个很棘手

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

我想做的是:在用户将每个视图左右滑动后,我想使用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
}
它将scrollview锁定在一起,但只要我移动其中一个scrollview,第二个scrollview就会跳转到与第一个scrollview相同的内容偏移量。我试图将它们锁定在此时的位置,而不是在用户触摸其中一个时将它们对齐


感谢您的帮助。

那么基本上您希望保持两个值之间的偏移量不变吗?在这种情况下,您需要一个变量,让我们称之为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;
    }
}

如果您不明白,当UISwitch lockSwitch打开时,应捕获可变偏移量。很漂亮!谢谢你的快速回答,亨利。我来试一试。@Henri我的代码有点问题。我在lockSwitch.on下添加了变量'offset',得到一个错误:二进制表达式'CGPoint'又名'struct CGPoint'和'NSInteger'又名'int'的操作数无效。有什么想法吗?在这两种情况下都有一个输入错误,scrollOne.contentOffset-offset应该是scrollOne.contentOffset.x-offset。已进行编辑,现在应该可以工作了。@Henri,谢谢。我做了更改,但没有锁定滚动视图。当锁定开关打开时,它们仍然独立移动。