Hvordan laver jeg en modal datovælger, der kun dækker halvdelen af skærmen?

Jeg ønsker at have samme virkning som fødselsdag dato setter i iPhone kontakter app. Hvordan får jeg en modal datovælger komme op kun halvvejs på skærmen.

Jeg ønsker datovælgeren til at være over en UITableView (ligesom i iphone kontakter app). Jeg vil gerne UITableView at rulle frit bag datovælger (ligesom i iphone kontakter app).

På forhånd tak.

Din ønskede modstrid eller har behov for at omformulere: du beder om, er en modal picker, mens på samme tid at have UITableView frit rulle bag det. Også, hvad der udløser den til at dukke op? Hver celle (med et textfield i dem)? Specifikke celler? Er det en knap i værktøjs – /narbar?

OriginalForfatteren klyngbaek | 2011-12-13

5 svar

  1. 48

    Langt den bedste måde at opnå en dato-picker/uipicker tastatur-som er til at bruge input udsigt ejet af et textfield:

    1. Bygge en simpel, brugerdefinerede UITableViewCell, der indeholder en UITextField (Det er kun vigtig, fordi spørgsmålet var, om en indlejring i en tabel, visning)

      @interface pickerCell : UITableViewCell
      {
          UITextField *txtTextField;
          UIPickerView* dtpPicker;
      }
    2. sæt TextField er inputview at være UIPickerView (sørg for de er begge blevet tildelt og står først):

      txtTextField.inputView = dtpPicker;
    3. Du er næsten færdig. Nu når textfield bliver den first responder (brugeren trykkede det), vil brugeren blive præsenteret for en picker udsigt.
      Bare fylde det med dine egne værdier. eller brug en datovælger.

    4. Kan du indstille vælgeren er uddelegere/datasource til den samme celle (hvis det vil altid være en fødselsdato cell) eller har den celle superview indlæse det med data. Uanset hvilket valg, du foretager, skal du sørge for at opdatere txtTextField.tekst på

      pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component

    Held og lykke!
    Elad.

    Dette er et meget bedre svar end at gøre brugerdefinerede animationer og tilføjelse af knapper.
    +1 det er temmelig meget, hvordan jeg ville gøre det.
    Dette er fantastisk! Præcis hvad jeg var på udkig efter. Tak!
    Jeg kan ikke helt forstå trin 4. Hvordan har jeg det UIDatePicker opdatere tekst-feltet når brugeren er færdig? Tak.
    At være mere direkte, kan du bruge UIDatePicker i stedet for UIPickerView

    OriginalForfatteren eladleb

  2. 2

    Denne kode vil tilføje en datovælger som en subview af UITableView. Denne kode forudsætter, at vi er en underklasse af UITableViewController.

    Vi kommer til at animere picker fra bunden. Endelig er vi hægte i scrollViewDidScroll: delegeret metode, så som tabellen ruller, picker ser ud til at forblive på plads.

    I din .h-fil, skal du tilføje en ejendom til vælgeren.

    @property (strong, nonatomic) UIDatePicker *datePicker;

    I din .m-fil, tilføjer vi en datovælger.

    - (void)viewDidLoad
    {
      //Your own customization code.
    
        self.datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 200, 320, 216)];
        self.datePicker.hidden = YES;
        [self.datePicker addTarget:self action:@selector(datePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
        [self.view addSubview:self.datePicker];
    }
    
    - (void)presentDatePicker
    {
        if (self.datePicker.hidden == NO) { return; }
    
        //Set the date picker frame to be below the screen.
        self.datePicker.frame = CGRectMake(0, self.view.frame.size.height, self.datePicker.size.width, self.datePicker.size.height);
        CGRect originFrame = self.datePicker.frame;
    
        //Animate from the bottom.
        [UIAnimation animateWithDuration:.3 animations^{
          self.datePicker.frame = CGRectMake(0, 200, originFrame.size.width, originFrame.size.height);
        }];
    }
    
    #pragma mark - Scroll view delegate
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
        CGRect tableBounds = self.tableView.bounds;
        CGRect datePickerFrame = self.datePicker.frame;
    
        self.datePicker.frame = CGRectMake(0, 200 + tableBounds.origin.y, datePickerFrame.size.width, datePickerFrame.size.height);
    }

    Glem ikke at @syntetisere din ejendom, og slip den på viewDidUnload

    meget godt svar. tak min mand

    OriginalForfatteren Oli

  3. 1

    I iPhone kontakter app datovælgeren kommer op, når der trykkes på en knap. For at gøre dette, Du vil har brug for et par ting:

    1. En knap, der er tilsluttet til en handling, lad os kalde den handling

      -(IBAction)showDatePicker:(id)sender

    2. En iVar, der er din datePicker, vi vil kalde, at datePicker.

    Nu, i ViewDidLoad du er nødt til at oprette datePicker, og sæt dens ramme. Fordi vi ikke vil have det til at dukke op, indtil showDatePicker trykker på knappen, indstil dens ramme, således at det er fra skærmen. (0,416,320,216) skal være god. Nu tilføje datePicker som en subview af din vc ‘ s mening. Husk, at det ikke bør dukke op endnu, fordi vi sat rammen for at slukke skærmen. Nu, i din showDatePicker handling, vi ønsker at gøre datePicker vises, så vi kan animere det i ved at ændre rammen i en blok-baseret animation:

    [UIView animateWithDuration:0.5 animations:^{
        [datePicker setFrame:CGRectMake(0, 200, 320, 216)];
    }];

    På samme måde, kan du gøre dette, hvis du ønsker at lave en knap, der gør det datePicker forsvinde. Du vil bare nødt til at sætte rammen tilbage til, hvad det oprindeligt var.

    Jeg håber det hjalp!

    -K

    Tak for dette! Animationen virkede fantastisk. Men den opfattelse jeg tilføje datePicker til, er en UITableView. Dette betyder, at datePicker ruller med UITableView. I kontakter app på iPhone, UITableView kan scrolle uafhængigt bag datePicker, der dukker op. Nogen idé om hvordan man gør dette? Tak!
    IMO er den nemmeste løsning er at du ikke føje det til en tableView på alle. Hvis du gøre din VC en underklasse af UIViewController i stedet for UITableViewController, kan det stadig have en tableView (og være delegeret og data kilde til det), men som en subview af de vigtigste udsigt (der er overraskende lidt, at UITableViewController ikke over en generisk VC). Derefter kan du tilføje den datePicker til hovedvisningen i stedet for tableView.

    OriginalForfatteren Kyle Rosenbluth

  4. 1

    Dette er, hvordan jeg har gennemført det: jeg har UIDatePicker i en anden controller kaldes DateTimeEntryViewController og jeg udføre følgende kode i min UIViewController, når brugeren klikker på knappen/celle til at indføre den dato og tid:

    self.alphaView = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    self.alphaView.opaque = NO;
    self.alphaView.backgroundColor = [UIColor clearColor];
    self.dateTimeEntryViewController.view.backgroundColor = [UIColor clearColor];
    
    UIWindow *window = [[TTNavigator navigator] window];
    [window addSubview:self.alphaView];
    [window insertSubview:self.dateTimeEntryViewController.view aboveSubview:self.alphaView];
    
    CGRect r = [_dateTimeEntryViewController.view frame];
    r.origin.y = 480.0f;
    [self.dateTimeEntryViewController.view setFrame:r]; 
    
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDuration:0.5f];
    self.alphaView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5f];
    r.origin.y = 0;
    [self.dateTimeEntryViewController.view setFrame:r];
    [UIView commitAnimations];

    Derfor er jeg dybest set viser view controller, som har UIDatePicker på toppen af den nuværende.

    OriginalForfatteren yeforriak

  5. 1

    Udstationering i en gammel tråd, men måske kan hjælpe nogen. Tilføjelse 200 er nok til 3,5″ skærm, for en universel tilgang, brug

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
       CGRect tableBounds = self.tableView.bounds;
       CGRect datePickerFrame = self.datePicker.frame;
       self.datePicker.frame = CGRectMake(0,
                                          tableBounds.origin.y + tableBounds.size.height - datePickerFrame.size.height,
                                          datePickerFrame.size.width,
                                          datePickerFrame.size.height);
    }

    OriginalForfatteren Roland

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *