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