2017-05-02 2 views
8

Mein Ziel ist es, eine Slotmachine zu erstellen, in der sich die Reihen drehen und eins nach dem anderen aufhören müssen, eins nach dem anderen zu drehen. Damit es jedoch gut aussieht, müssen die Zeilen mindestens 3 Sekunden lang gedreht werden. Ich denke PickerView ist die beste Option dafür, da ich keine Ahnung habe, wie man das anders machen kann.Wie kann ich die Geschwindigkeit verringern, mit der eine Zeile in einem PickerView ausgewählt wird?

Wenn dies ist mein Code:

self.slotMachine.selectRow(99, inComponent: 1, animated: true) 

Die picker 99 rudern gehen, aber in 1 Sekunde. Wie kann ich diese Sekunde steuern (und den Auswahlreihenprozess erweitern)? Eine Bedingung ist, dass es gut aussieht und sich anfühlt, als würde man einen Spielautomaten spielen. Ich habe es versucht:

UIView.animate(withDuration: 3.0, delay: 0, animations: {() -> Void in 
     self.slotMachine.selectRow(99, inComponent: 1, animated: true) 
    }, completion: nil) 

Aber das hat nicht funktioniert.

Danke.

+0

Check out http: //stackoverflow.com/questions/3832474/uitableview-row-animation-duration-and-completion-callback Sie könnten etwas finden, das hilft. – rmaddy

+0

* "Aber das hat nicht funktioniert." * Das Offensichtliche fragen, aber ... was ist passiert? Warum hat es nicht funktioniert? Und wenn Sie sagen "in einer Sekunde, nicht drei", müssen Sie wahrscheinlich - bestenfalls - Unterklasse UIPickerView und im schlimmsten Fall Ihre eigenen. – dfd

+0

Werfen Sie einen Blick auf diese Kakaokontrolle: https://www.coacoacontrols.com/controls/zcslotmachine –

Antwort

1

könnten Sie einen Timer verwenden, und die Zellen nacheinander wie folgt aus:

var timer = Timer() 
var currentRow = 0 

override func viewDidLoad() { 
    super.viewDidLoad() 
    timer = Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: #selector(timerAction), userInfo: nil, repeats: true) 
} 

func timerAction() { 
    currentRow += 1 
    self.slotMachine.selectRow(currentRow, inComponent: 1, animated: true) 
    if(currentRow == 99){ 
     timer.invalidate() 
    } 
} 
+0

FYI - das ist über 'UIPickerView', nicht' UITableView'. – rmaddy

+0

Danke. Behoben. –

+0

Ja, das könnte funktionieren ... aber es scheint nicht sehr nett zu sein. Ich werde meine Frage bearbeiten. –

1

Swift Version:

import UIKit 

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate { 

    var picker: UIPickerView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     picker = UIPickerView(frame: CGRect(x: 0, y: 100, width: 100, height: 375)); 
     view.addSubview(picker) 
     picker.dataSource = self 
     picker.delegate = self 

     let button = UIButton(frame: CGRect(x: 50, y: 50, width: 100, height: 100)) 
     button.backgroundColor = .red 
     button.addTarget(self, action: #selector(trigger), for: .touchUpInside) 
     view.addSubview(button) 
    } 

    func trigger() { 
     let timer = Timer.scheduledTimer(timeInterval: 0.25, target: self, selector: #selector(scrollRandomly), userInfo: nil, repeats: true); 
     //call the block 3 seconds later 
     DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(Int64(3*NSEC_PER_SEC))/Double(NSEC_PER_SEC)) { 
      timer.invalidate() 
      //always select 500 finally 
      self.picker.selectRow(500, inComponent: 0, animated: true) 
     } 
    } 

    func scrollRandomly() { 
     let row:Int = Int(arc4random() % 1000); 
     picker.selectRow(row, inComponent: 0, animated: true) 
    } 


    func numberOfComponents(in pickerView: UIPickerView) -> Int { 
     return 1 
    } 

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { 
     return 1000 
    } 

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { 
     return row.description 
    } 
} 

OC Version:

#import "ViewController.h" 

@interface ViewController() <UIPickerViewDelegate, UIPickerViewDataSource> 
@property (weak, nonatomic) UIPickerView *picker; 
@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    UIPickerView *picker = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 100, 100, 375)]; 
    self.picker = picker; 
    [self.view addSubview:picker]; 
    picker.delegate = self; 
    picker.showsSelectionIndicator = true; 

    UIButton *b = [[UIButton alloc] initWithFrame:CGRectMake(50, 50, 100, 100)]; 
    b.backgroundColor = [UIColor redColor]; 
    [self.view addSubview:b]; 
    [b addTarget:self action:@selector(bbbb) forControlEvents:UIControlEventTouchUpInside]; 
} 

- (void)bbbb { 


    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.25 repeats:true block:^(NSTimer * _Nonnull timer) { 
     NSInteger row = arc4random()%1000; 
     [self.picker selectRow:row inComponent:0 animated:true]; 
    }]; 

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     [timer invalidate]; 
     [self.picker selectRow:500 inComponent:0 animated:true]; 
    }); 

} 

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { 
    return 1000; 
} 

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView { 
    return 1; 
} 


- (nullable NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { 
    return [NSString stringWithFormat:@"%ld",row]; 
} 

@end 
Verwandte Themen