我正在尝试实现方法 scrollViewWillBeginDragging。 当调用此方法时,我检查用户是否已选择滚动视图中的一个按钮处于状态:selected。 如果没有,那么我会显示一个UIAlert来通知用户。
我的问题是,如果用户从向右滚动(从右侧拉下一个视图),我只想调用所选按钮( NextQuestion )方法。 但如果他们从从左向右滚动,那么我希望它能够正常滚动。
目前无论用户在哪个方向滚动,都会调用检查器方法。如何从从右到左滚动时调用方法?
以下是我目前的实施方式:
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
[self NextQuestion:scrollView];
}
-(IBAction)NextQuestion:(id)sender
{
CGFloat pageWidth = scrollView.frame.size.width;
int page = floor((scrollView.contentOffset.x - pageWidth) / pageWidth) + 1;
NSInteger npage = 0;
CGRect frame = scrollView.frame;
// Check to see if the question has been answered. Call method from another class.
if([QuestionControl CheckQuestionWasAnswered:page])
{
pageNumber++;
NSLog(@"Proceed");
if(([loadedQuestionnaire count] - 1) != page)
{
[self loadScrollViewWithPage:page - 1];
[self loadScrollViewWithPage:page];
[self loadScrollViewWithPage:page + 1];
}
// update the scroll view to the appropriate page
frame = scrollView.frame;
frame.origin.x = (frame.size.width * page) + frame.size.width;
frame.origin.y = 0;
[self.scrollView scrollRectToVisible:frame animated:YES];
}
// If question has not been answered show a UIAlert with instructions.
else
{
UIAlertView *alertNotAnswered = [[UIAlertView alloc] initWithTitle:@"Question Not Answered"
message:@"You must answer this question to continue the questionnaire."
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil];
[alertNotAnswered show];
}
}
解决方案1的代码:
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
NSLog(@"%f",scrollView.contentOffset.x);
if (scrollView.contentOffset.x < lastOffset) // has scrolled left..
{
lastOffset = scrollView.contentOffset.x;
[self NextQuestion:scrollView];
}
}
答案 0 :(得分:21)
在scrollViewWillBeginDragging
中,滚动视图尚未移动(或已注册移动),因此contentOffset
将为0.从IOS 5开始,您可以在滚动视图的panGestureRecognizer
中查看确定用户滚动手势的方向和大小。
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
CGPoint translation = [scrollView.panGestureRecognizer translationInView:scrollView.superview];
if(translation.x > 0)
{
// react to dragging right
} else
{
// react to dragging left
}
}
答案 1 :(得分:0)
在 class.h 文件中设置CGFloat lastOffset
为member variable
..
然后在viewDidLoad
中将其设置为0。
然后检查
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
if (scrollView.contentOffset.x < lastOffset) // has scrolled left..
{
lastOffset = scrollView.contentOffset.x;
[self NextQuestion:scrollView];
}
}
答案 2 :(得分:0)
当委托收到 scrollViewDidBeginDragging:消息时,您可以将起始偏移量保存为类的成员。 获得该值后,您可以将滚动视图偏移的 x 值与您存储的值进行比较,并查看视图是向左还是向右拖动。
如果在拖动中间更改方向很重要,则可以在 viewDidScroll:委托方法中重置比较点。因此,更完整的解决方案将存储最后检测到的方向和基本偏移点,并在每次拖动合理距离时更新状态。
- (void) scrollViewDidScroll:(UIScrollView *)scrollView
{
CGFloat distance = lastScrollPoint.x - scrollView.contentOffset.x;
NSInteger direction = distance > 0 ? 1 : -1;
if (abs(distance) > kReasonableDistance && direction != lastDirection) {
lastDirection = direction;
lastScrollPoint = scrollView.contentOffset;
}
}
“合理的距离”是你需要的任何东西,以防止滚动方向在左右之间轻松翻转,但大约10点应该足够了。