我正在尝试为iPad应用实现水平滚动视图。滚动视图显示一系列图像。滚动后,当滚动视图停止时,我希望图像沿水平方向沿特定点对齐。为此,我尝试了两种方法:
1)禁用UIScrollView的滚动,而是实现PanGestureRecogniser,它将检测“滑动/拖动”运动的平移和速度,并根据所需的预定点设置滚动视图的内容偏移。但是,这里的问题是如果用户慢慢拖动滚动视图,则滚动视图运动非常不稳定,因为检索到的滚动视图的x坐标围绕手指被按压的点来回跳跃。例如:当手指沿着60-70移动时,x值从50变为70。如何使滚动视图的运动平滑?
2)启用UIScrollView的滚动并检查减速结束,然后设置滚动视图的内容偏移以将其调整到所需位置。但问题是滚动视图只有在停止减速后才会调整到最终位置,并且有一个可见的延迟,这个动画看起来也不太好。是否有一种方法可以检测滚动视图何时即将停止滚动然后调整其位置而不是等待它结束滚动。从iv在某些论坛上阅读的内容来看,这是不可能的。
3)分页滚动视图在这种情况下不起作用,因为我不希望滚动出整个图像宽度。
有没有人对如何实现上述功能有任何想法。
答案 0 :(得分:2)
我遇到了vertical
scrollview
同样的问题,并使用了方法2.即使这个问题已经过时,我也没有在这里找到解决方案,觉得这样做会很棒答案。
简短回答是scrollViewWillEndDragging:withVelocity:targetContentOffset:
UIScrollViewDelegate
protocol
中的方法。
当用户完成滚动并且动画开始减速时,它会为您提供targetContentOffset
。您可以更改此方法中的targetContentOffset
,以便animation
将尽可能地结束。你的工作只是计算目标位置。
这是我创建的UIView
子类。我想创建一个类似UIPickerView
的类,但我想让它停在特定位置(比如日期选择器)。
我创建了一个符合UIView
的{{1}}子类。在此UIScrollViewDelegate
中,我添加了UIView
。此scrollView
将包含scrollView
个实例。小心,我使用UILabel
,所以我不发布任何内容。
ARC
实施:
#import <UIKit/UIKit.h>
@protocol MyPickerViewDataSource <NSObject>
-(NSUInteger)numberOfRowsForSender:(id)sender;
-(NSString *)titleForRowAtIndex:(NSUInteger)rowIndex sender:(id)sender;
@end
@interface MyPickerView : UIView <UIScrollViewDelegate>
@property (weak, nonatomic) id<MyPickerViewDataSource> dataSource;
@end
答案 1 :(得分:1)
您实际上仍然可以使用分页滚动视图来执行此操作。您需要做的就是将clipsToBounds
设置为NO
(以便允许滚动视图中的内容在其框架外呈现),然后将frame
设置为所需的对齐步骤
例如,如果要将滚动视图对齐为200的倍数,则可以执行以下操作:
scrollView.pagingEnabled = YES;
scrollView.clipsToBounds = NO;
// horizontally center scroll view with a width of 200 and the parent's height
scrollView.frame = CGRectMake(
floor((parentView.bounds.size.width - 200) / 2),
0,
200,
parentView.bounds.size.height
);
[parentView addSubview:scrollView];