我正在寻求一些帮助。我通常很擅长找到我需要的东西,但这个很棘手。
这是我的测试应用程序的场景:我有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
}
它将滚动视图锁定在一起,但是一旦我移动其中一个滚动视图,第二个滚动视图就跳转到与第一个相同的内容偏移。我试图将它们锁定在那个时刻,而不是在用户触摸其中一个时将它们排成一行。
提前感谢您的帮助。
答案 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;
}
}