2011-11-02 14 views
13

Próbuję wyświetlić UIActionSheet na iPada z UIPickerView w nim, mam równoważne działający kod dla iPhone więc moja UIPickerView delegata i źródło danych stuff pracy, ale na iPadzie, gdy używam -[UIActionSheet showFromRect:inView:animated:] wynik UIPopover/UIActionSheet jest o wiele za mały i nie mogę ustawić rozmiaru klatki, również żaden z przycisków nie jest wyświetlany.UIActionSheet na iPadzie ramie zbyt małej

Nie wiem, czy to dlatego, że są poza granicami, czy jest coś innego. Tak wygląda mój kod po usunięciu wszystkich nieistotnych kodów (iPhone itp.). Czy ktokolwiek wie, co robię źle, czy ktokolwiek zna jakieś przykłady.

CGRect thePickerFrame = CGRectMake(0, 0, 320.0, 485.0); 
UIPickerView * thePickerView = [[UIPickerView alloc] initWithFrame:thePickerFrame]; 

[pickerActionSheet release], pickerActionSheet = 
     [[UIActionSheet alloc] initWithTitle:@"Choose" delegate:self 
           cancelButtonTitle:@"Cancel" 
           destructiveButtonTitle:nil 
           otherButtonTitles:@"Next", nil]; 
thePickerView.showsSelectionIndicator = YES; 
thePickerView.dataSource = self; 
thePickerView.delegate = self; 

[pickerActionSheet addSubview:thePickerView]; 
[thePickerView selectRow:0 inComponent:0 animated:NO]; 
[thePickerView release]; 

[pickerActionSheet showFromRect:currentTextField.bounds 
          inView:currentTextField animated:NO]; 
pickerActionSheet.frame = thePickerFrame; 
+0

Po prostu trochę eksperymentowałem, aby zobaczyć, kiedy - [UIActionSheet setFrame:] jest wywoływana. Wydaje mi się, że po pętli zdarzeń, o której mowa powyżej, nazywana jest kolejną pętlą zdarzeń zainicjowaną przez wynik iOS w - [- UIActionSheet setFrame:] jest wywoływana z małą ramką, która jest wyświetlana. –

+1

Nie jest lepiej dzięki funkcji Popover na iPadzie z tą funkcjonalnością? AFAIK ActionSheet służy tylko do przycisków. – Eimantas

Odpowiedz

18

myślę, że nie jest skalowalny UIActionSheet, spróbuj komentarz w kodzie linię z [pickerActionSheet addSubview:thePickerView]; i widać, że ActionSheet pasuje perfecly do przycisków.

Polecam UIPopoverController z niestandardowym UIViewController. Coś takiego:

UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)]; 
toolbar.barStyle = UIBarStyleDefault; 

UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"back" style:UIBarButtonItemStyleBordered target:self action:@selector(BACK_ACTION:)]; 
UIBarButtonItem *chooseButton = [[UIBarButtonItem alloc] initWithTitle:@"Choose" style:UIBarButtonItemStylePlain target:nil action:nil]; 
UIBarButtonItem *nextButton = [[UIBarButtonItem alloc] initWithTitle:@"Next" style:UIBarButtonItemStyleBordered target:self action:@selector(NEXT_ACTION:)]; 
UIBarButtonItem *fixed1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 
UIBarButtonItem *fixed2 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 

[toolbar setItems:[NSArray arrayWithObjects:cancelButton, fixed1, chooseButton, fixed2, nextButton, nil]]; 

UIPickerView *thePickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 44, 320, 216)]; 
CGRect thePickerFrame = thePickerView.frame; 
thePickerFrame.origin.y = toolbar.frame.size.height; 
[thePickerView setFrame:thePickerFrame]; 


UIView *view = [[UIView alloc] init]; 
[view addSubview:thePickerView]; 
[view addSubview:toolbar]; 

UIViewController *vc = [[UIViewController alloc] init]; 
[vc setView:view]; 
[vc setContentSizeForViewInPopover:CGSizeMake(320, 260)]; 

popover = [[UIPopoverController alloc] initWithContentViewController:vc]; 

thePickerView.showsSelectionIndicator = YES; 
thePickerView.dataSource = self; 
thePickerView.delegate = self; 

[thePickerView selectRow:0 inComponent:0 animated:NO]; 

[popover presentPopoverFromRect:currentTextField.bounds inView:currentTextField permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 

Gdzie popover jest zmienną klasy zadeklarowane w .h (UIPopoverController *popover;).

Nawiasem mówiąc, używam ARC, więc nie ma zwolnienia w kodzie.

8

Udało mi się sprawić, by działało to w głupi sposób.

Dla odniesienia:
PickerView Setup.
Szerokość UIActionSheet's nie może być w jakiś sposób dopasowana, więc trzeba odpowiednio dostosować pickerView. Mądrość wysokości można dostosować za pomocą wartości "\ n" w tytule actionSheet.

UIDatePicker * pickerView = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, 270, 220)]; 
pickerView.datePickerMode = UIDatePickerModeDate; 

UIActionSheet * actionSheet = [[UIActionSheet alloc] initWithTitle:@"\n\n\n\n\n\n\n\n\n\n\n\n\n" delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles: nil];  

[actionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent]; 
[actionSheet addSubview:pickerView]; 
[actionSheet showFromRect:button.frame inView:button.superview animated:YES]; 
[actionSheet release]; 

Zestaw ramek lub wiązań nie działa dla mnie.

[actionSheet setBounds:pickerView.frame]; 
[actionSheet setFrame:pickerView.frame]; 



uzgodnili użyciu UIPopoverController, ale nie wiem, dlaczego to ma poważne opóźnienia UI kiedy kładę UIDatePickerView do popover (zajęło prawie 1 sek opóźnienie do pop-up), który nie mogę znajdź główną przyczynę. Więc musicie wrócić do powyższej metody.


Happy Coding.

+0

Mimo hacky jest to przynajmniej łatwe do wdrożenia w uniwersalnej aplikacji. Dzięki! –