iOS 8 Actionsheet und Datepicker

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • iOS 8 Actionsheet und Datepicker

    Hi,
    ich habe vor längerer Zeit ein Projekt von einen anderen Programmierer übernommen. Folgender Code zeigt mir ohne Probleme unter iOS 7 ein ActionSheet mit Datepicker und Speichern Button an. Der selbe Code liefert unter iOS 8 nur den Speicher Button und der Datepicker ist nicht da. Warum? Was muss ich anders machen, dass es unter iOS 8 läuft? Ich bin am verzweifeln.

    Quellcode

    1. ​UIActionSheet * sheet = [[UIActionSheet alloc] initWithTitle:@"" delegate:self cancelButtonTitle:NSLocalizedString(@"save", nil) destructiveButtonTitle:nil otherButtonTitles:nil];
    2. sheet.backgroundColor = [UIColor whiteColor];
    3. sheet.tag = 2;
    4. [sheet addSubview:self.datePicker];
    5. sheet bringSubviewToFront:self.datePicker];
    6. [sheet showFromRect:sender.view.frame inView:self.view animated:YES];
    7. sheet.bounds = CGRectMake(0, 0, sheet.frame.size.width, 480);
    8. self.datePicker.frame = CGRectMake(self.datePicker.frame.origin.x,-200, self.datePicker.bounds.size.width, self.datePicker.bounds.size.height);


    Viele Grüße
    Nils
  • Sagt doch die Doku:

    Apple Doku schrieb:

    Subclassing Notes

    UIActionSheet is not designed to be subclassed, nor should you add views to its hierarchy. If you need to present a sheet with more customization than provided by the UIActionSheet API, you can create your own and present it modally with presentViewController:animated:completion:.
    „Meine Komplikation hatte eine Komplikation.“
  • Dies ist mir mit iOS 7 schon mit dem UIAlertView passiert. Da hatte ich bis iOS 6 auch problemlos einen UIActivityIndicatorView hinzugefügt. Dies ging ab iOS 7 dann leider nicht mehr.

    Obwohl der UIAlertView ein UIView ist wird dieser ab iOS 7 nicht mehr für die eigentliche Anzeige des Alert verwendet. Anscheinend war Apple es leid, dass Entwickler den AlertView mit eigenen Subviews bestückten. :D

    Auf die Idee ein UIActionSheet um einen DatePicker zu erweitern wäre ich jedoch nicht gekommen. Dies geht doch wunderbar mit einem View, welcher per Animation von unten hereingeschoben wird.
  • So ich hab jetzt mal ein bisschen gebastelt und folgenden Code geschrieben:

    Quellcode

    1. UIView *actionSheetView = [[UIView alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height, self.view.frame.size.width, 307)];
    2. actionSheetView.backgroundColor = [UIColor whiteColor];
    3. UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 45)];
    4. [actionSheetView addSubview:toolbar];
    5. UIBarButtonItem *done = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:nil];
    6. toolbar.items = @[done];
    7. self.datePicker.frame = CGRectMake(0, 45, self.datePicker.bounds.size.width, self.datePicker.bounds.size.height);
    8. [actionSheetView addSubview:self.datePicker];
    9. UIButton *saveButton = [[UIButton alloc] initWithFrame:CGRectMake(0, self.datePicker.frame.size.height+45, self.view.frame.size.width, 45)];
    10. [saveButton setTitle:NSLocalizedString(@"save", nil) forState:UIControlStateNormal];
    11. [saveButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
    12. [actionSheetView addSubview:saveButton];
    13. [self.view addSubview:actionSheetView];
    14. [self setChoosePickerHidden:NO WithView:actionSheetView];
    15. - (void)setChoosePickerHidden:(BOOL)hidden WithView:(UIView *)pickerView {
    16. CGAffineTransform transform;
    17. if (!hidden) {
    18. transform = CGAffineTransformMakeTranslation(0, -CGRectGetHeight(pickerView.frame) );
    19. } else {
    20. transform = CGAffineTransformMakeTranslation(0, CGRectGetHeight(pickerView.frame));
    21. }
    22. [UIView animateWithDuration:0.3 animations:^{
    23. pickerView.transform = transform;
    24. }];
    25. }
    Alles anzeigen


    Nur leider ist das Ergebnis eher ernüchternd. (siehe Bild) Warum ist der SubView im TableView drinnen und nicht davor? Was hab ich denn falsch gemacht?
    Dateien
    • IMG_1708.jpg

      (72,03 kB, 317 mal heruntergeladen, zuletzt: )
  • macmoonshine schrieb:

    Warum verwendest Du nicht, wie Apple es vorschlägt, einen modalen Viewcontroller?

    Wäre der dann nicht Fullscreen? Ich möchte eben nur so ein kleinen Teil da unten haben. Und bei Modal dachte ich das wäre über den ganzen Bildschirm. Irre ich mich da? Kann man einen Modal View auch nur über so einen kleinen Teil machen?

    Michael schrieb:

    Wenn ich davon ausgehe, dass self.view den TableView zurück liefert, dann fügst du ja deinen actionSheetView in die TableView-Hierarchie ein. Dann ist der natürlich auch im TableView und nicht davor.

    Das habe ich gar nicht bedacht. Stimmt. Mist!
  • macmoonshine schrieb:

    AppleDeveloper schrieb:

    Kann man einen Modal View auch nur über so einen kleinen Teil machen?

    Du kannst einen transparenten Hintergrund verwenden, dann verdeckt er nicht die gesamte Fläche. Unter iOS 8 bietet sich auch die Verwendung eines UIVisualEffectView an.


    Ich hatte da schon mal und der macht mir irgendwie bei Modal keinen transparenten Hintergrund wenn ich den View auf transparent setzte. Den iOS 8 Effekt kann ich auch leider nicht verwenden, da die App leider noch unter iOS 7 laufen soll. Gibt es noch irgendwas einfaches? Wie würdest du das lösen?
  • Füge den actionSheetView doch einfach zum Window hinzu. Dann liegt dieser über allen Elementen. An das Window kommst Du über UIApplication.

    Evtl. solltest Du den actionSheetView noch in einen View legen welcher Fullscreen ist. Bei einem touch in den View ausserhalb des actionSheetView würde ich diesen dann wieder ausblenden. So kann man auch keine andere UI Elemente mehr bedienen, welche über dem actionSheetView noch angezeigt werden.

    Wie macmoonshine schon vorgeschlagen hat lässt sich dies ab iOS 7 evtl. auch über einen modal angezeigten ViewController realisieren.