Come modificare l'altezza di UIPickerView


116

È possibile modificare l'altezza di UIPickerView? Alcune applicazioni sembrano avere PickerView più brevi ma l'impostazione di un frame più piccolo non sembra funzionare e il frame è bloccato in Interface Builder.


1
Ulteriori risposte possono essere trovate in una domanda simile: come ridurre la visualizzazione del selettore in iPhone? .
Brad Larson

Risposte:


54

Sembra ovvio che Apple non inviti particolarmente al muck con l'altezza predefinita di UIPickerView, ma ho scoperto che puoi ottenere un cambiamento nell'altezza della vista assumendo il controllo completo e passando una dimensione del fotogramma desiderata al momento della creazione, ad esempio:

smallerPicker = [[UIPickerView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 120.0)];

Scoprirai che a varie altezze e larghezze ci sono difetti visivi. Ovviamente, questi difetti dovrebbero essere risolti in qualche modo o scegliere un'altra dimensione che non li mostri.


2
Questo funziona per te? Tutte le UIPickerViews che istanzio sembrano essere bloccate a un'altezza di 215 ...
Andy Bourassa

Per me funziona. Stai specificando l'altezza ridotta nel metodo initWithFrame, come ho descritto? Tendono a lottare per rimanere a una certa altezza, ma una volta inizializzato con un frame corto, ha funzionato. Se ancora non riesci a farlo funzionare, vedrò se riesco a estrarne un campione.
danielpunkass

Esiste un controllo di terze parti che consente il ridimensionamento?
cfischer

1
Questo ha funzionato. 4.3. Inizio con frame e setframe prima della prima apparizione.
griotspeak

2
Sono rimasto bloccato su questo per un po '. È IMPORTANTE notare che DEVI inizializzare con frame o setframe prima della prima apparizione o avrai problemi visivi.
w.donahue

46

Nessuno degli approcci di cui sopra funziona in iOS 4.0

L'altezza di pickerView non è più ridimensionabile. C'è un messaggio che viene scaricato sulla console se si tenta di modificare il frame di un selettore in 4.0:

-[UIPickerView setFrame:]: invalid height value 66.0 pinned to 162.0 

Ho finito per fare qualcosa di abbastanza radicale per ottenere l'effetto di un selettore più piccolo che funziona sia con OS 3.xx che con OS 4.0. Ho lasciato il selettore alla dimensione che l'SDK decide che dovrebbe essere e invece ho creato una finestra trasparente tagliata sulla mia immagine di sfondo attraverso la quale il selettore diventa visibile. Quindi è sufficiente posizionare il selettore dietro (in base all'ordine Z) il mio sfondo UIImageView in modo che sia visibile solo una parte del selettore che è dettata dalla finestra trasparente nel mio sfondo.


44

Ci sono solo tre altezze valide per UIPickerView (162.0, 180.0 and 216.0).

È possibile utilizzare le funzioni CGAffineTransformMakeTranslatione CGAffineTransformMakeScaleper adattare correttamente il selettore alla propria comodità.

Esempio:

CGAffineTransform t0 = CGAffineTransformMakeTranslation (0, pickerview.bounds.size.height/2);
CGAffineTransform s0 = CGAffineTransformMakeScale       (1.0, 0.5);
CGAffineTransform t1 = CGAffineTransformMakeTranslation (0, -pickerview.bounds.size.height/2);
pickerview.transform = CGAffineTransformConcat          (t0, CGAffineTransformConcat(s0, t1));

Il codice precedente modifica l'altezza della visualizzazione del selettore a metà e lo riposiziona nella posizione esatta (Sinistra-x1, Alto-y1) .


1
Bella risposta. Solo una nota che per cambiare l'altezza del selettore non è necessario utilizzare la traduzione: pickerview.transform = CGAffineTransformMakeScale (1.0, 0.5);
Borzh

2
Grazie. Sembra vero ma esiste una documentazione Apple sulle altezze valide?
Eric Chen

40

Provare:

pickerview.transform = CGAffineTransformMakeScale(.5, 0.5);

2
So di essere in ritardo alla festa qui - e forse ora esistono metodi migliori per farlo, ma per me ha funzionato.
Hanny

Funziona alla grande! Per Swift (iOS 10) è: statePicker.transform = CGAffineTransform (scaleX: 0.8, y: 0.8)
Meshach

25

In iOS 4.2 e 4.3 funziona quanto segue:

UIDatePicker *datePicker = [[UIDatePicker alloc] init];
datePicker.frame = CGRectMake(0, 0, 320, 180);
[self addSubview:datePicker];

Quanto segue non funziona:

UIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, 320, 180)];
[self addSubview:datePicker];

Ho un'app che si trova nell'app store con un selettore di date a 3 righe. Ho pensato che il cambio di altezza potesse essere stato impedito perché vedi il testo sotto il bordo del selettore di date, ma questo accade anche al normale selettore di date 216 di altezza.

Qual è il bug? La tua ipotesi è buona quanto la mia.

Inoltre ci sono 3 altezze valide per UIDatePicker(e UIPickerView) 162,0, 180,0 e 216,0. Se imposti UIPickerViewun'altezza su qualsiasi altra cosa, vedrai quanto segue nella console durante il debug su un dispositivo iOS.

2011-09-14 10:06:56.180 DebugHarness[1717:707] -[UIPickerView setFrame:]: invalid height value 300.0 pinned to 216.0

14

A partire da iOS 9, puoi modificare liberamente UIPickerViewla larghezza e l'altezza. Non è necessario utilizzare gli hack di trasformazione sopra menzionati.


è necessario determinare come aggiungere un inputAccessoryView a un UIPickerView di dimensioni maggiori.
DogCoffee

Condivisione della mente come?
inmanl

10

Ho scoperto che puoi modificare la dimensione di UIPickerView, ma non con il generatore di interfacce. apri il file .xib con un editor di testo e imposta la dimensione della visualizzazione del selettore come preferisci. Il generatore di interfacce non ripristina le dimensioni e sembra funzionare. Sono sicuro che Apple abbia bloccato le dimensioni per un motivo, quindi dovrai sperimentare dimensioni diverse per vedere cosa funziona.


7

vantaggi:

  1. Fa sì che setFrame si UIPickerViewcomporti come dovrebbe
  2. Nessun codice di trasformazione all'interno del tuo UIViewController
  3. Funziona all'interno viewWillLayoutSubviewsper riscalare / posizionare il fileUIPickerView
  4. Funziona su iPad senza UIPopover
  5. La superclasse riceve sempre un'altezza valida
  6. Funziona con iOS 5

svantaggi:

  1. Richiede una sottoclasse UIPickerView
  2. Richiede l'uso di pickerView viewForRowper annullare la trasformazione per le viste secondarie
  3. UIAnimations potrebbe non funzionare

Soluzione:

Sottoclasse UIPickerView e sovrascrivi i due metodi usando il codice seguente. Combina sottoclassi, altezza fissa e approccio di trasformazione.

#define FIXED_PICKER_HEIGHT 216.0f
- (void) setFrame:(CGRect)frame
{
    CGFloat targetHeight = frame.size.height;
    CGFloat scaleFactor = targetHeight / FIXED_PICKER_HEIGHT;
    frame.size.height = FIXED_PICKER_HEIGHT;//fake normal conditions for super
    self.transform = CGAffineTransformIdentity;//fake normal conditions for super
    [super setFrame:frame];
    frame.size.height = targetHeight;
    CGFloat dX=self.bounds.size.width/2, dY=self.bounds.size.height/2;
    self.transform = CGAffineTransformTranslate(CGAffineTransformScale(CGAffineTransformMakeTranslation(-dX, -dY), 1, scaleFactor), dX, dY);
}

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
    //Your code goes here

    CGFloat inverseScaleFactor = FIXED_PICKER_HEIGHT/self.frame.size.height;
    CGAffineTransform scale = CGAffineTransformMakeScale(1, inverseScaleFactor);
    view.transform = scale;
    return view;
}

7

Un modo semplice per modificare l'altezza visibile di una vista di selezione è incorporare il selettore in una vista UIV, regolare l'altezza della vista principale all'altezza che si desidera vedere del selettore, quindi abilitare "Clip Subviews" in Interface Builder nella UIView principale o impostato view.clipsToBounds = truenel codice.

Sottoviste di clip in IB


puoi confermare che funziona davvero? Su xcode sembra che sia ma in esecuzione sul dispositivo mostra la pickerview su quella uiview
nhenrique

1
Funziona con @nhenrique, ma non devi dimenticarlo Clip Subviews. anche la taglia UIPickerViewdeve essere più alta - e devi mirare al centro del tuo UIPickerViewper essere visibile all'interno del genitoreUIView
new2ios

Buona idea, questa era la soluzione per me in iOS 7.1.
Douglas Nassif Roma Junior

Non funziona, @ new2ios, puoi confermare che funziona in iOS8>? Sto cercando di fare la stessa cosa in modo programmatico.
Hemang

Scusa, @hagile, ma abbandono l'idea - non posso confermare. Uso Storyboard (non creato UIPickerViewdal codice).
new2ios

5

Non sono stato in grado di seguire nessuno dei consigli di cui sopra.

Ho guardato più tutorial e ho trovato questo il più vantaggioso:

Ho aggiunto il seguente codice per impostare la nuova altezza all'interno del metodo "viewDidLoad", che ha funzionato nella mia app.

UIPickerView *picker = [[UIPickerView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 120.0)]; 
[self.view addSubview:picker];
picker.delegate = self;
picker.dataSource = self;

Spero sia stato utile!


4

Questo è cambiato molto in iOS 9 (in iOS 8 è abbastanza simile a quello che vediamo qui). Se puoi permetterti di scegliere come target solo iOS 9, ridimensiona UIPickerViewcome ritieni opportuno, impostando la sua cornice. Buona!

Eccolo dalle note di rilascio di iOS 9

UIPickerView e UIDatePicker ora sono ridimensionabili e adattivi: in precedenza, queste viste imponevano una dimensione predefinita anche se si tentava di ridimensionarle. Queste visualizzazioni ora impostano una larghezza predefinita di 320 punti su tutti i dispositivi, invece che sulla larghezza del dispositivo su iPhone.

Le interfacce che si basano sulla vecchia applicazione della dimensione predefinita risulteranno probabilmente sbagliate quando vengono compilate per iOS 9. Eventuali problemi riscontrati possono essere risolti vincolando o ridimensionando completamente le visualizzazioni di selezione alla dimensione desiderata invece di fare affidamento sul comportamento implicito.


2

Sto lavorando con ios 7, Xcode 5. Sono stato in grado di regolare l'altezza del selettore di data indirettamente racchiudendolo in una vista. L'altezza delle viste del contenitore può essere regolata.


Ha funzionato fintanto che l'ho eseguito su ios 7. Quando ho eseguito la stessa build su ios 6, l'intero selettore si presenta aspettato per parti che vengono sovrascritte da altre visualizzazioni. Finché scegli come target solo> = 7, questo potrebbe essere fattibile. Ordinare le viste in modo tale che il selettore venga renderizzato per primo nasconde in modo efficace le parti esterne, ma questo le maschera solo con altre viste.
Doug Gerecht

Puoi spiegare un po 'di più su come è stato fatto? Serve solo per ridurre la visualizzazione o puoi ingrandire anche il selettore? Attualmente sto sviluppando un'app per iPad iOS 7 e ho bisogno che il selettore sia più alto, ma non importa cosa provo, non riesco a farlo diventare più grande!
Lizza

2

Crea una vista in IB o codice. Aggiungi il tuo selettore come vista secondaria di questa vista. Ridimensiona la vista. Questo è più facile da fare in IB. Crea vincoli dalla vista alla sua superview e dal selettore a questa nuova vista.

Poiché il selettore si curva intorno ad esso si riversa sopra e sotto la vista. Puoi vedere in IB quando aggiungi i vincoli top e bottom dal selettore alla vista che mostra uno spazio standard qualcosa come 16 punti sopra e sotto il contenitore superview. Imposta la vista per ritagliarla se non vuoi questo comportamento (brutto avvertimento).

Ecco come appare a 96 punti di altezza su un iPhone 5. Il selettore con lo spillover è alto circa 130 punti. Piuttosto magro!

Lo sto usando nel mio progetto per evitare che il raccoglitore si diffonda a un'altezza non necessaria. Questa tecnica lo riduce e forza una fuoriuscita più stretta. In realtà sembra più liscio per essere un po 'più compatto.

inserisci qui la descrizione dell'immagine

Ecco un'immagine della vista che mostra lo spillover.

inserisci qui la descrizione dell'immagine

Ecco i vincoli IB che ho aggiunto.

inserisci qui la descrizione dell'immagine


1

Anche se non si ridimensiona, un altro trucco può essere d'aiuto nella situazione in cui l'UIPicker si trova nella parte inferiore dello schermo.

Si può provare a spostarlo leggermente verso il basso, ma la riga centrale dovrebbe rimanere visibile. Ciò aiuterà a rivelare un po 'di spazio sopra il selettore poiché le righe inferiori saranno fuori schermo.

Ripeto che questo non è il modo per cambiare l'altezza della vista di UIPicker ma qualche idea su cosa puoi fare se tutti gli altri tentativi falliscono.


1

Ok, dopo aver lottato a lungo con la stupida vista di selezione in iOS 4, ho deciso di cambiare il mio controllo in una semplice tabella: ecco il codice:

ComboBoxView.m = which is actually looks more like pickerview.

//
//  ComboBoxView.m
//  iTrophy
//
//  Created by Gal Blank on 8/18/10.
//

#import "ComboBoxView.h"
#import "AwardsStruct.h"


@implementation ComboBoxView

@synthesize displayedObjects;

#pragma mark -
#pragma mark Initialization

/*
- (id)initWithStyle:(UITableViewStyle)style {
    // Override initWithStyle: if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
    if ((self = [super initWithStyle:style])) {
    }
    return self;
}
*/


#pragma mark -
#pragma mark View lifecycle

/*
- (void)viewDidLoad {
    [super viewDidLoad];

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}
*/

/*
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
}
*/
/*
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
}
*/
/*
- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
}
*/
/*
- (void)viewDidDisappear:(BOOL)animated {
    [super viewDidDisappear:animated];
}
*/
/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/


#pragma mark -
#pragma mark Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return 1;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
    return [[self displayedObjects] count];
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {


    NSString *MyIdentifier = [NSString stringWithFormat:@"MyIdentifier %i", indexPath.row];

    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
        //cell.contentView.frame = CGRectMake(0, 0, 230.0,16);
        UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(0, 5, 230.0,19)] autorelease];
        VivatAwardsStruct *vType = [displayedObjects objectAtIndex:indexPath.row];
        NSString *section = [vType awardType]; 
        label.tag = 1;
        label.font = [UIFont systemFontOfSize:17.0];
        label.text = section;
        label.textAlignment = UITextAlignmentCenter;
        label.baselineAdjustment = UIBaselineAdjustmentAlignCenters;
        label.adjustsFontSizeToFitWidth=YES;
        label.textColor = [UIColor blackColor];
        //label.autoresizingMask = UIViewAutoresizingFlexibleHeight;
        [cell.contentView addSubview:label]; 
        //UIImage *image = nil;
        label.backgroundColor = [UIColor whiteColor];
        //image = [awards awardImage];
        //image = [image imageScaledToSize:CGSizeMake(32.0, 32.0)];

        //[cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
        //UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
        //cell.accessoryView = imageView;
        //[imageView release];
    }

    return cell;
}


/*
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return NO if you do not want the specified item to be editable.
    return YES;
}
*/


/*
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
    }   
    else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }   
}
*/


/*
// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
}
*/


/*
// Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return NO if you do not want the item to be re-orderable.
    return YES;
}
*/


#pragma mark -
#pragma mark Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Navigation logic may go here. Create and push another view controller.
    /*
     <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
     // ...
     // Pass the selected object to the new view controller.
     [self.navigationController pushViewController:detailViewController animated:YES];
     [detailViewController release];
     */
}


#pragma mark -
#pragma mark Memory management

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Relinquish ownership any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
    // For example: self.myOutlet = nil;
}


- (void)dealloc {
    [super dealloc];
}


@end

Ecco il file .h per questo:

//
//  ComboBoxView.h
//  iTrophy
//
//  Created by Gal Blank on 8/18/10.
//

#import <UIKit/UIKit.h>


@interface ComboBoxView : UITableViewController {
    NSMutableArray *displayedObjects;
}

@property (nonatomic, retain) NSMutableArray *displayedObjects;


@end

now, in the ViewController where I had Apple UIPickerView I replaced with my own ComboBox view and made it size what ever I wish.

ComboBoxView *mypickerholder = [[ComboBoxView alloc] init]; 
[mypickerholder.view setFrame:CGRectMake(50, 220, 230, 80)];
[mypickerholder setDisplayedObjects:awardTypesArray];

questo è tutto, ora l'unica cosa che resta è creare una variabile membro nella vista della casella combinata che manterrà la selezione della riga corrente, e siamo a posto.

Goditi tutti.


ecco cos'è VivatAwardsStruct, sto ricevendo un errore qui, VivatAwardsStruct non dichiarato
Mahesh Babu

1

In genere non è possibile farlo in xib o impostando il frame in modo programmatico, ma se si apre il suo xib genitore come sorgente e si modifica l'altezza da lì, allora funziona. in quel tag, cambia l'altezza lì e salva il file.

<pickerView contentMode="scaleToFill" id="pai-pm-hjZ">
                                    <rect key="frame" x="0.0" y="41" width="320" height="100"/>
                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
                                    <connections>
                                        <outlet property="dataSource" destination="-1" id="Mo2-zp-Sl4"/>
                                        <outlet property="delegate" destination="-1" id="nfW-lU-tsU"/>
                                    </connections>
                                </pickerView>

0

Per quanto ne so, è impossibile ridurre l'UIPickerView. Inoltre non ne ho mai visto uno più corto usato da nessuna parte. La mia ipotesi è che fosse un'implementazione personalizzata se sono riusciti a ridurla.


Puoi ridimensionare uipickerview orizzontalmente, ma se lo imposti troppo breve causerà problemi visivi.
futureelite7

0

Se desideri creare il tuo selettore in IB, puoi post-ridimensionarlo a una dimensione inferiore. Controlla per assicurarti che disegni ancora correttamente, poiché arriva un punto in cui sembra atroce.


0

Swift : è necessario aggiungere una sottoview con clip ai limiti

    var DateView = UIView(frame: CGRectMake(0, 0, view.frame.width, 100))
    DateView.layer.borderWidth=1
    DateView.clipsToBounds = true

    var myDatepicker = UIDatePicker(frame:CGRectMake(0,-20,view.frame.width,162));
    DateView.addSubview(myDatepicker);
    self.view.addSubview(DateView)

Questo dovrebbe aggiungere un selettore di date con altezza 100 ritagliata nella parte superiore del controller della vista.


0

Il mio trucco: usa il livello maschera di DatePicker per rendere visibile una parte di datePicker. come vedi proprio come cambiare la cornice del datepicke.

- (void)timeSelect:(UIButton *)timeButton {
UIDatePicker *timePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 550)];
timePicker.backgroundColor = [UIColor whiteColor];
timePicker.layer.mask = [self maskLayerWithDatePicker:timePicker];
timePicker.layer.masksToBounds = YES;
timePicker.datePickerMode = UIDatePickerModeTime;
[self.view addSubview:timePicker];
}

- (CALayer *)maskLayerWithDatePicker:(UIDatePicker *)datePicker {
CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] init];
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, datePicker.width*0.8, datePicker.height*0.8) cornerRadius:10];
shapeLayer.path = path.CGPath;
return shapeLayer;
}

0

Uso un livello maschera per modificare la dimensione del display

// swift 3.x
let layer = CALayer()
layer.frame = CGRect(x: 0,y:0, width: displayWidth, height: displayHeight)
layer.backgroundColor = UIColor.red.cgColor
pickerView.layer.mask = layer

0

Incorpora in una visualizzazione stack. La visualizzazione stack è un componente aggiunto di recente da Apple nel proprio SDK iOS per riflettere le implementazioni basate su griglia nelle librerie front-end basate sul Web di java script come bootstrap.


0

Come accennato in precedenza UIPickerViewè ora ridimensionabile. Voglio solo aggiungere che se vuoi cambiare l'altezza del pickerView in una cella tableView, non ho avuto alcun successo con l'impostazione dell'ancora di altezza su una costante. Tuttavia, l'utilizzo lessThanOrEqualToConstantsembra funzionare.

 class PickerViewCell: UITableViewCell {

    let pickerView = UIPickerView()

    func setup() {

        // call this from however you initialize your cell

        self.contentView.addSubview(self.pickerView)
        self.pickerView.translatesAutoresizingMaskIntoConstraints = false

        let constraints: [NSLayoutConstraint] = [
            // pin the pickerView to the contentView's layoutMarginsGuide

            self.pickerView.leadingAnchor.constraint(equalTo: self.contentView.layoutMarginsGuide.leadingAnchor),
            self.pickerView.topAnchor.constraint(equalTo: self.contentView.layoutMarginsGuide.topAnchor),
            self.pickerView.trailingAnchor.constraint(equalTo: self.contentView.layoutMarginsGuide.trailingAnchor),
            self.pickerView.bottomAnchor.constraint(equalTo: self.contentView.layoutMarginsGuide.bottomAnchor),

            // set the height using lessThanOrEqualToConstant
            self.pickerView.heightAnchor.constraint(lessThanOrEqualToConstant: 100)
        ]

        NSLayoutConstraint.activate(constraints)
     }

 }

-1

Dopo una lunga giornata passata a grattarmi la testa, ho trovato qualcosa che funziona per me. I codici seguenti ricreano l'UIDatePicker ogni volta che l'utente cambia l'orientamento del telefono. Questo rimuoverà tutti i difetti che l'UIDatePicker ha dopo un cambio di orientamento.

Poiché stiamo ricreando l'UIDatePicker, abbiamo bisogno di una variabile di istanza che manterrà il valore della data selezionato. I codici seguenti sono testati su iOS 4.0.

    @interface AdvanceDateViewController : UIViewController<UIPickerViewDelegate> {
        UIDatePicker *datePicker;
        NSDate *date;
    }


    @property (nonatomic, retain) UIDatePicker *datePicker;
    @property (nonatomic, retain) NSDate *date;

    -(void)resizeViewWithOrientation:(UIInterfaceOrientation) orientation;

    @end

    @implementation AdvanceDateViewController
    @synthesize datePicker, date;

    - (void)viewDidLoad {
      [super viewDidLoad];
          [self resizeViewWithOrientation:self.interfaceOrientation];
    }


    -(void)viewWillAppear:(BOOL)animated{
         [super viewWillAppear:animated];
         [self resizeViewWithOrientation:self.interfaceOrientation];
     }

     - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
         return YES;
     }

     -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
      [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
      [self resizeViewWithOrientation:toInterfaceOrientation];
      }

     -(void)resizeViewWithOrientation:(UIInterfaceOrientation) orientation{
          [self.datePicker removeFromSuperview];
          [self.datePicker removeTarget:self action:@selector(refreshPickupDate) forControlEvents:UIControlEventValueChanged];
          self.datePicker = nil;

          //(Re)initialize the datepicker, thanks to Apple's buggy UIDatePicker implementation
          UIDatePicker *dummyDatePicker = [[UIDatePicker alloc] init];
          self.datePicker = dummyDatePicker;
          [dummyDatePicker release];

          [self.datePicker setDate:self.date animated:YES];
          [self.datePicker addTarget:self action:@selector(refreshPickupDate) forControlEvents:UIControlEventValueChanged];

          if(UIInterfaceOrientationIsLandscape(orientation)){
                 self.datePicker.frame = CGRectMake(0, 118, 480, 162);    
           } else {
                 self.datePicker.frame = CGRectMake(0, 200, 320, 216);
           }

           [self.view addSubview:self.datePicker];
           [self.view setNeedsDisplay];
      }

      @end

-1
stockPicker = [[UIPickerView alloc] init];
stockPicker.frame = CGRectMake(70.0,155, 180,100);

Se vuoi impostare la dimensione di UiPickerView. Il codice sopra funzionerà sicuramente per te.


-1

In iOS 5.0, ho ottenuto quanto segue per funzionare:

UIDatePicker *picker = [[UIDatePicker alloc] init];
picker.frame = CGRectMake(0.0, 0.0, 320.0, 160.0);

Questo ha creato un selettore di date come quello che Apple utilizza nell'app Calendario quando crea un nuovo evento in modalità orizzontale. (3 righe di altezza invece di 5.) Questo non ha funzionato quando ho impostato il frame all'interno del initWithFrame:metodo, ma finora funziona quando lo ho impostato utilizzando un metodo separato.


-1

per iOS 5:

se dai una rapida occhiata al riferimento al protocollo UIPickerView

lo troverai

 pickerView:rowHeightForComponent:
 pickerView:widthForComponent:

Penso sia il primo che stai cercando


pickerView:rowHeightForComponent:è il metodo delegato per decidere l'altezza di ogni riga, non l'altezza della vista di selezione.
turingtested
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.