2009-10-02 12 views
5

Me gustaría obtener el valor de la fila en tiempo real a medida que el usuario del iPhone hace girar una rueda en un UIPickerView (no solo cuando la rueda se instala en una fila en particular). Intenté subclasificar UIPickerView y luego anular el método mouseDown, pero no pude hacer que esto funcionara. Cualquier sugerencia sería muy apreciada.UIPickerView: ¿obtiene valor de fila mientras gira?

Respuesta

0

Las dimensiones UIPickerView son bastante consistentes. En lugar de subclasificarlo, tal vez podría superponer un UIView propio en la parte superior de la vista del selector, desde la cual puede rastrear y medir los movimientos de arrastre, antes de pasar esos toques a la vista del selector.

+0

Excepto que entonces tendrías que realizar una ingeniería inversa de la cantidad de vueltas que tuvo lugar para cualquier arrastre dado, una después de haberlo dejado ir ... –

+0

No estoy seguro de que el problema sea diferente con el enfoque de subclases. Al menos con el enfoque 'UIView', su código podría reutilizarse más fácilmente para otros fines. –

+0

Es cierto, cualquier enfoque que mirara solo la entrada a la vista del selector tendría el mismo problema. –

10

Tal vez intente implementar el método delegado:

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view 

Se podía tratarla como una pasarela (de paso hacia atrás el parámetro reusingView), pero cada vez que se llama usted sabría que la vista se viene en la pantalla como el usuario se desplazó, entonces usted podría calcular cuántas vistas se compensaban con respecto a esta vista central.

+0

Esto funcionó! Gracias Kendall. Muy inteligente. – user183266

+0

Aún más fácil: en ese método, llame al componente (NSInteger) selectedRowInComponent: (NSInteger), obtendrá la fila actual y podrá recuperar su valor sin calcular las compensaciones ni preocuparse por la forma en que gira el selector. –

0

puede encontrar UIScrollView en la jerarquía UIPickerView por el siguiente método:

func findScrollView(view:UIView) -> UIScrollView? { 
    if view is UIScrollView { 
     return view as? UIScrollView 
    } 
    for subview in view.subviews { 
     if subview is UIView { 
      let result = findScrollView(subview as UIView) 
      if result != nil { 
       return result 
      } 
     } 
    } 
    return nil 
} 

implementar y configuración UIScrollViewDelegate:

let scrollView = findScrollView(pickerView) 
if scrollView != nil { 
    scrollView!.delegate = self 
} 

y detectar corriente elemento seleccionado:

func scrollViewDidScroll(scrollView: UIScrollView) { 
    let offset = scrollView.contentOffset.y 
    let index = Int(offset/itemHeight) 
    if index >= 0 && index < items.count { 
     let item = items[index] 
     // do something with item 
    } 
} 
+0

esto no funciona –

Cuestiones relacionadas