2009-10-02 6 views
5

Ich möchte den Zeilenwert in Echtzeit erhalten, während der iPhone-Benutzer ein Rad in einem UIPickerView dreht (nicht nur, wenn sich das Rad in einer bestimmten Reihe niederlässt). Ich schaute in UIPickerView Unterklassen und überschrieb dann die MouseDown-Methode, aber ich konnte nicht das zum Funktionieren bringen. Irgendwelche Vorschläge würden sehr geschätzt werden.UIPickerView: Erhalte Zeilenwert während des Drehens?

Antwort

0

Die UIPickerView Dimensionen sind ziemlich konsistent. Anstatt eine Unterklasse zu erstellen, könnten Sie vielleicht eine eigene UIView über der Picker-Ansicht überlagern, von der Sie Ziehen-Bewegungen verfolgen und messen können, bevor Sie diese Berührungen an die Picker-Ansicht übergeben.

+0

Abgesehen davon, dass dann Sie müssten die Anzahl der Drehungen, die für einen bestimmten Widerstand stattgefunden haben, rückentwickeln Nachdem Sie losgelassen hatten ... –

+0

Ich bin mir nicht sicher, ob das Problem mit dem Unterklassenansatz anders wäre. Zumindest mit dem UIView-Ansatz könnte sein Code für andere Zwecke einfacher wiederverwendet werden. –

+0

Richtig, jeder Ansatz, der nur die Eingabe in die Auswahlansicht betrachtet, hätte das gleiche Problem. –

10

Vielleicht versuchen die delegierte Methode der Umsetzung:

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

Man könnte es als Pass-Through behandeln (nur auf der Durch die reusingView Parameter zurück), aber jedes Mal, es hieß Sie würde diese Ansicht wissen, kam auf dem Bildschirm als Der Benutzer scrollte - dann konnten Sie berechnen, wie viele Ansichten von dieser Ansicht in der Mitte versetzt waren.

+0

Das hat funktioniert! Danke Kendall. Sehr schlau. – user183266

+0

Noch einfacher: Rufen Sie in dieser Methode die Komponente - (NSInteger) selectedRowInComponent: (NSInteger) auf. Sie erhalten die aktuelle Zeile und können ihren Wert abrufen, ohne Offsets zu berechnen oder sich Gedanken darüber zu machen, wie der Picker sich dreht. –

0

Sie können UIScrollView in UIPickerView Hierarchie nach der folgenden Methode finden:

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 
} 

Implementierung und Setup UIScrollViewDelegate:

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

Und aktuell ausgewähltes Element erkennen:

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

das funktioniert nicht –