我刚刚发现,如果我执行以下操作:
UIPickerView
到我的视图然后它还没有选择最后一个项目。
我试图通过在didSelectRow
方法被触发时简单地输出到控制台,并在车轮稳定在最后一个项目时触发。
我是否可以检测到滚轮仍在滚动,以便我可以延迟检查选定的值,直到它稳定下来?
如果重要的话,我正在使用MonoTouch进行编程,但如果您有一个代码示例,我可以很好地阅读Objective-C代码以重新实现它。
答案 0 :(得分:7)
由于动画按键不起作用,我编写了这个简单的函数,用于检测UIPickerView当前是否正在移动。
-(bool) anySubViewScrolling:(UIView*)view
{
if( [ view isKindOfClass:[ UIScrollView class ] ] )
{
UIScrollView* scroll_view = (UIScrollView*) view;
if( scroll_view.dragging || scroll_view.decelerating )
{
return true;
}
}
for( UIView *sub_view in [ view subviews ] )
{
if( [ self anySubViewScrolling:sub_view ] )
{
return true;
}
}
return false;
}
它最终返回真正的五个级别。
答案 1 :(得分:3)
由于animationKeys
似乎不再起作用,我有另一个解决方案。如果您查看UIPickerView
的子视图,则会看到每个组件都有UIPickerTableView
。
此UIPickerTableView
确实是UITableView
的子类,当然还有UIScrollView
的子类。因此,您可以检查其contentOffset
值以检测差异。
此外,默认情况下它的scrollViewDelegate
为零,所以我假设您可以安全地设置您的对象以检测scrollViewWillBeginDragging
,scrollViewDidEndDecelerating
等。
通过保留对每个UIPickerTableView
的引用,您应该能够实现有效的isWheelRolling
方法。
答案 2 :(得分:3)
扩展@iluvatar_GR回答
extension UIView {
func isScrolling () -> Bool {
if let scrollView = self as? UIScrollView {
if (scrollView.isDragging || scrollView.isDecelerating) {
return true
}
}
for subview in self.subviews {
if ( subview.isScrolling() ) {
return true
}
}
return false
}
func waitTillDoneScrolling (completion: @escaping () -> Void) {
var isMoving = true
DispatchQueue.global(qos: .background).async {
while isMoving == true {
isMoving = self.isScrolling()
}
DispatchQueue.main.async {
completion()}
}
}
}
答案 3 :(得分:1)
Swift 4(已更新)版本,扩展为@DrainBoy答案
extension UIView {
func isScrolling () -> Bool {
if let scrollView = self as? UIScrollView {
if (scrollView.isDragging || scrollView.isDecelerating) {
return true
}
}
for subview in self.subviews {
if ( subview.isScrolling() ) {
return true
}
}
return false
}
}
答案 4 :(得分:1)
扩展@iluvatar_GR,@ Robert_at_Nextgensystems回答
使用过Gesture,UIScrollView是拖拽或减速。
// Call it every time when Guesture action.
@objc func respondToSwipeGesture(gesture: UIGestureRecognizer) {
// Changes the button name to scrolling at the start of scrolling.
DispatchQueue.main.async {
self._button.setTitle("Scrolling...", for: .normal)
self._button.isEnabled = false
self._button.backgroundColor = Utils.hexStringToUIColor(hex: "FF8FAE")
}
// Indication according to scrolling status
_datePicker.waitTillDoneScrolling(completion: {
print("completion")
DispatchQueue.main.async {
self._button.setTitle("Completion", for: .normal)
self._button.isEnabled = true
self._button.backgroundColor = Utils.hexStringToUIColor(hex: "7CB0FF")
}
})
}
[SWIFT4]分享示例来源链接!
答案 5 :(得分:-1)
我认为您可以检查UIPickerView是否处于动画中并等待它停止。这是在link
回答的答案 6 :(得分:-1)
您可以在选择器上使用SwipeGestureRecognizer。 我认为这根本不是一个完美的解决方案。
- (void)viewDidLoad
{
[super viewDidLoad];
_pickerSwipeGestureRecognizer.delegate = self;
[_pickerSwipeGestureRecognizer setDirection:(UISwipeGestureRecognizerDirectionDown | UISwipeGestureRecognizerDirectionUp)];
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
if([gestureRecognizer isEqual:_pickerSwipeGestureRecognizer]){
NSLog(@"start");
}
}
- (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
NSLog(@"end");
}