Một số bạn có gửi mail hỏi mình cách làm game này , nhưng do bận nhiều việc qua nên chưa có tg làm 1 bài hướng dẫn . Hôm nay mình làm bài hướng dẫn CƠ BẢN cho các bạn về lớp UIPickerView cụ thể là game đua thú :
Để làm game này , ngoài cơ bản về UIPickerView ( các bạn có thể xem trên developer.apple.com/ios ) thì có 1 số điểm cần quan tâm để các bạn có thể customize cái UIPickerView :
- Làm sao để đưa hình vào UIPickerView
- Làm sao để làm cho UIPickerView chạy mà ko cần phải vuốt nó
- Làm sao để tạo cảm giác UIPickerView quay thật nhiều , vì UIPickerView của chúng ta chỉ có 5 con thú , trong khi bạn nhấn nút quay thì nó sẽ quay mấy chục vòng !
Thứ 1 :Đưa hình vào UIPickerView :
Bình thường khi ta muốn Pickerview hiện ra Text thì ra override hàm này :
PHP Code:
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
return [mang objectAtIndex:row%6];
}
với kiểu trả về là NSString
Vậy muốn picker hiện ra hình ta override hàm :
PHP Code:
- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row
forComponent:(NSInteger)component reusingView:(UIView *)view
{
UIImageView *heo = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"babycow.png"]];
heo.frame = CGRectMake(0, 0, 50, 50);
UIImageView *gau = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"bear.png"]];
gau.frame = CGRectMake(0, 0, 50, 50);
UIImageView *ong = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"bee.png"]];
ong.frame = CGRectMake(0, 0, 50, 50);
UIImageView *ketxanh = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"blueparrot.png"]];
ketxanh.frame = CGRectMake(0, 0, 50, 50);
UIImageView *chimcanhcut = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"penguine.png"]];
chimcanhcut.frame = CGRectMake(0, 0, 50, 50);
UIImageView *chimxanh = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"tweetie.png"]];
chimxanh.frame = CGRectMake(0, 0, 50, 50);
mang = [[NSArray alloc]initWithObjects:heo,gau,ong,ketxanh,chimcanhcut,chimxanh, nil];
if (component == 0) {
return [mang objectAtIndex:row%6];
}
if (component == 1) {
return [mang objectAtIndex:row%6];
}
if (component == 2) {
return [mang objectAtIndex:row%6];
}
return 0;
}
Hàm này trả về một đối tượng UiView , nên muốn chèn hình vào thì bạn cho return 1 đối tượng UIImageView (ko phải UIImage nha ) , hoặc có thể là button v.v.v miễn nó kế thừa từ UIView !
Tại sao lại là row%6 sẽ giải thích ở phần cuối !
Thứ 2 : Để làm cho picker nhảy mà ko cần vuốt , UIPickerView hỗ trợ cho ta 2 hàm sau
PHP Code:
[mypickerview selectRow:dong_nao inComponent:thuoc_component_nao animated:YES];
[mypickerview reloadComponent:thuoc_component_nao];
Ví dụ : đang ở dòng 3 thuộc component 0 , bạn gọi hàm thứ nhất truyền vào dòng 4 component 0 sau đó gọi hàm thứ 2 để load lại component 0 thì picker của bạn sẽ nhảy đến vị trí dòng 4 . Bạn nhớ cho animated là YES mới có hiệu ứng nha !
Cuối cùng : Làm sao để tạo cảm giác UIPickerView quay thật nhiều
Đơn giản thôi : cho số lượng dòng trong mỗi component là 10.000 dòng chẳng hạn
PHP Code:
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
if (component == 0) {
return 10000;
}
if (component == 1) {
return 10000;
}
if (component == 2) {
return 10000;
}
return 0 ;
}
Nhưng quan trọng là mình chỉ có 1 mảng 5 con thú với index là từ 0 tới 5 vậy nếu ở dòng thứ 2000 làm sao tôi lấy ra phần tử trong mảng ra được !

Bạn lấy dòng đó % cho 6 là xong :
PHP Code:
if (component == 0) {
return [mang objectAtIndex:row%6];
}
if (component == 1) {
return [mang objectAtIndex:row%6];
}
if (component == 2) {
return [mang objectAtIndex:row%6];
}
Vậy là xong ! Game của mình đơn giản chỉ có vậy ! còn xét cho quay nhanh chậm ra sao là tùy vào giải thuật của mỗi người !hehe!
Chúc các bạn học thật tốt !

À Các bạn ko học tại nhất nghệ hoặc các bạn bên Android có thể xem topic của thầy Khoa về UIPickerView để hiểu thêm nha !