Comment changer la hauteur d'UIPickerView

116

Est-il possible de changer la hauteur de UIPickerView? Certaines applications semblent avoir des PickerViews plus courts, mais la définition d'un cadre plus petit ne semble pas fonctionner et le cadre est verrouillé dans Interface Builder.

Steven Canfield
la source
1
Des réponses supplémentaires peuvent être trouvées dans une question similaire: comment réduire la vue du sélecteur sur iPhone? .
Brad Larson

Réponses:

54

Il semble évident qu'Apple n'invite pas particulièrement le déblayage avec la hauteur par défaut du UIPickerView, mais j'ai constaté que vous pouvez obtenir un changement de hauteur de la vue en prenant le contrôle complet et en passant une taille d'image souhaitée au moment de la création, par exemple:

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

Vous découvrirez qu'à différentes hauteurs et largeurs, il y a des problèmes visuels. De toute évidence, ces problèmes devraient être résolus d'une manière ou d'une autre, ou choisir une autre taille qui ne les présente pas.

danielpunkass
la source
2
Cela fonctionne pour vous? Toutes les UIPickerViews que j'instancie semblent être verrouillées à une hauteur de 215 ...
Andy Bourassa
Ça marche pour moi. Spécifiez-vous la hauteur raccourcie dans la méthode initWithFrame, comme je l'ai décrit? Ils ont tendance à se battre pour rester à une certaine hauteur, mais une fois que j'ai initialisé avec un cadre court, cela a fonctionné. Si vous n'arrivez toujours pas à le faire fonctionner, je verrai si je peux en extraire un échantillon.
danielpunkass
Existe-t-il un contrôle tiers permettant le redimensionnement?
cfischer
1
Cela a fonctionné. 4.3. J'ai initié avec le cadre et le setframe avant la première apparition.
griotspeak
2
J'étais coincé là-dessus pendant un moment. Il est IMPORTANT de noter que vous DEVEZ initier avec frame ou setframe avant la première apparition ou vous obtiendrez des problèmes visuels.
w.donahue
46

Aucune des approches ci-dessus ne fonctionne sous iOS 4.0

La hauteur du pickerView n'est plus redimensionnable. Il y a un message qui est sauvegardé dans la console si vous essayez de changer le cadre d'un sélecteur dans 4.0:

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

J'ai fini par faire quelque chose d'assez radical pour obtenir l'effet d'un sélecteur plus petit qui fonctionne à la fois sous OS 3.xx et OS 4.0. J'ai laissé le sélecteur à la taille que le SDK décide qu'il devrait être et j'ai plutôt créé une fenêtre transparente coupée sur mon image d'arrière-plan à travers laquelle le sélecteur devient visible. Ensuite, placez simplement le sélecteur derrière (ordre Z) mon arrière-plan UIImageView afin que seule une partie du sélecteur soit visible, ce qui est dicté par la fenêtre transparente dans mon arrière-plan.

bhavinb
la source
44

Il n'y a que trois hauteurs valides pour UIPickerView (162.0, 180.0 and 216.0).

Vous pouvez utiliser les fonctions CGAffineTransformMakeTranslationet CGAffineTransformMakeScalepour adapter correctement le sélecteur à votre convenance.

Exemple:

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));

Le code ci-dessus modifie la hauteur de la vue du sélecteur à la moitié et la repositionne à la position exacte (Left-x1, Top-y1) .

JRSee
la source
1
Très bonne réponse. Notez simplement que pour changer la hauteur du sélecteur, vous n'avez pas besoin d'utiliser la traduction: pickerview.transform = CGAffineTransformMakeScale (1.0, 0.5);
Borzh
2
Merci. Cela semble vrai mais y a-t-il une documentation Apple sur les hauteurs valides?
Eric Chen
40

Essayer:

pickerview.transform = CGAffineTransformMakeScale(.5, 0.5);
vijay adhikari
la source
2
Je sais que je suis en retard à la fête ici - et peut-être qu'il existe de meilleures méthodes pour le faire maintenant, mais cela a fonctionné pour moi.
Hanny
Fonctionne très bien! Pour Swift (iOS 10) c'est: statePicker.transform = CGAffineTransform (scaleX: 0.8, y: 0.8)
Meshach
25

Dans iOS 4.2 et 4.3, les travaux suivants:

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

Ce qui suit ne fonctionne pas:

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

J'ai une application qui est dans l'App Store avec un sélecteur de date à 3 lignes. Je pensais que le changement de hauteur avait peut-être été évité car vous voyez le texte sous la bordure du sélecteur de date, mais cela arrive également au sélecteur de date normal de 216 hauteurs.

Quel est le bug? Votre estimation est aussi bonne que la mienne.

Il existe également 3 hauteurs valides pour UIDatePicker(et UIPickerView) 162,0, 180,0 et 216,0. Si vous définissez une UIPickerViewhauteur sur autre chose, vous verrez ce qui suit dans la console lors du débogage sur un appareil iOS.

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

À partir d'iOS 9, vous pouvez modifier librement UIPickerViewla largeur et la hauteur. Pas besoin d'utiliser les hacks de transformation mentionnés ci-dessus.

Rounak
la source
besoin de déterminer comment ajouter un inputAccessoryView à un UIPickerView de taille accrue.
DogCoffee
Comment partager l'esprit?
inmanl
10

J'ai trouvé que vous pouvez modifier la taille de UIPickerView - mais pas avec le constructeur d'interface. ouvrez le fichier .xib avec un éditeur de texte et définissez la taille de la vue du sélecteur sur ce que vous voulez. Le constructeur d'interface ne réinitialise pas la taille et semble fonctionner. Je suis sûr qu'Apple a verrouillé la taille pour une raison, vous devrez donc expérimenter différentes tailles pour voir ce qui fonctionne.


la source
7

Avantages:

  1. Fait en sorte que setFrame UIPickerViewse comporte comme il se doit
  2. Aucun code de transformation dans votre UIViewController
  3. Fonctionne à l'intérieur viewWillLayoutSubviewspour redimensionner / positionner leUIPickerView
  4. Fonctionne sur l'iPad sans UIPopover
  5. La superclasse reçoit toujours une hauteur valide
  6. Fonctionne avec iOS 5

Désavantages:

  1. Vous oblige à sous-classer UIPickerView
  2. Nécessite l'utilisation de pickerView viewForRowpour annuler la transformation des sous-vues
  3. UIAnimations peut ne pas fonctionner

Solution:

Sous-classe UIPickerView et remplacez les deux méthodes à l'aide du code suivant. Il combine le sous-classement, la hauteur fixe et l'approche de transformation.

#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;
}
HeikoG
la source
7

Un moyen simple de modifier la hauteur visible d'une vue de sélecteur consiste à incorporer le sélecteur dans un UIView, à ajuster la hauteur de la vue parente à la hauteur que vous voulez voir du sélecteur, puis à activer "Sous-vues de clip" dans Interface Builder sur l'UIView parent ou défini view.clipsToBounds = truedans le code.

Sous-vues de clip dans IB

svarrall
la source
pouvez-vous confirmer que cela fonctionne réellement? Sur xcode, ça y ressemble, mais en cours d'exécution sur l'appareil, il montre le pickerview sur cet uiview
nhenrique
1
Cela fonctionne @nhenrique, mais il ne faut pas oublier Clip Subviews. aussi la taille du UIPickerViewdoit être plus grand - et vous devez viser le centre de votre UIPickerViewpour être visible à l'intérieur du parentUIView
new2ios
Bonne idée, c'était la solution pour moi dans iOS 7.1.
Douglas Nassif Roma Junior
Cela ne fonctionne pas, @ new2ios, pouvez-vous confirmer que cela fonctionne dans iOS8>? J'essaye de faire la même chose par programmation.
Hemang
Désolé, @hagile, mais j'abandonne cette idée - je ne peux pas confirmer. J'utilise Storyboard (je n'ai pas créé à UIPickerViewpartir du code).
new2ios
5

Je n'ai pu suivre aucun des conseils ci-dessus.

J'ai regardé plusieurs tutoriels et j'ai trouvé celui- ci le plus bénéfique:

J'ai ajouté le code suivant pour définir la nouvelle hauteur dans la méthode "viewDidLoad", qui fonctionnait dans mon application.

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

J'espère que cela a été utile!

erran
la source
4

Cela a beaucoup changé dans iOS 9 (dans iOS 8, c'est assez similaire à ce que nous voyons ici). Si vous pouvez vous permettre de cibler uniquement iOS 9, vous redimensionnez le UIPickerViewcomme bon vous semble, en définissant son cadre. Bien!

Le voici à partir des notes de publication d' iOS 9

UIPickerView et UIDatePicker sont désormais redimensionnables et adaptatifs. Auparavant, ces vues imposaient une taille par défaut même si vous tentiez de les redimensionner. Ces vues ont également désormais par défaut une largeur de 320 points sur tous les appareils, au lieu de la largeur de l'appareil sur iPhone.

Les interfaces qui reposent sur l'ancienne application de la taille par défaut sembleront probablement incorrectes lorsqu'elles seront compilées pour iOS 9. Tous les problèmes rencontrés peuvent être résolus en contraignant ou en dimensionnant complètement les vues du sélecteur à la taille souhaitée au lieu de s'appuyer sur un comportement implicite.

Dan Rosenstark
la source
2

Je travaille avec ios 7, Xcode 5. J'ai pu ajuster la hauteur du sélecteur de date indirectement en l'enfermant dans une vue. La hauteur des vues du conteneur peut être ajustée.

serveur
la source
Cela a fonctionné tant que je l'ai exécuté sur ios 7. Lorsque j'exécute cette même version sur ios 6, le sélecteur entier s'affiche, attendez-vous à des parties qui sont écrasées par d'autres vues. Tant que vous ciblez uniquement> = 7, cela peut être viable. Le fait de classer les vues de telle sorte que le sélecteur soit rendu en premier masque efficacement les parties périphériques, mais cela ne fait que les masquer avec d'autres vues.
Doug Gerecht
Pouvez-vous expliquer un peu plus comment cela a été fait? Est-ce uniquement pour réduire la vue, ou pouvez-vous également agrandir le sélecteur? Je développe actuellement une application iPad iOS 7 et j'ai besoin que le sélecteur soit plus grand, mais peu importe ce que j'essaye, je ne peux pas l'agrandir!
Lizza
2

Créez une vue dans IB ou code. Ajoutez votre sélecteur en tant que sous-vue de cette vue. Redimensionnez la vue. C'est plus facile à faire dans IB. Créez des contraintes de la vue à sa vue de supervision et du sélecteur à cette nouvelle vue.

Étant donné que le sélecteur se courbe autour, il se répand en haut et en bas de la vue. Vous pouvez voir dans IB lorsque vous ajoutez des contraintes du haut et du bas du sélecteur à la vue, il affiche un espace standard quelque chose comme 16 points au-dessus et en dessous du conteneur superview. Réglez la vue pour la couper si vous ne voulez pas ce comportement (horrible avertissement).

Voici à quoi cela ressemble à 96 points de haut sur un iPhone 5. Le sélecteur avec le débordement mesure environ 130 points de haut. Assez maigre!

J'utilise ceci dans mon projet pour empêcher le sélecteur de s'étendre à une hauteur inutile. Cette technique le réduit et force un débordement plus serré. Il semble en fait plus lisse d'être un peu plus compact.

entrez la description de l'image ici

Voici une image de la vue montrant le débordement.

entrez la description de l'image ici

Voici les contraintes IB que j'ai ajoutées.

entrez la description de l'image ici

smileBot
la source
1

Même s'il n'est pas redimensionné, une autre astuce peut aider dans le cas où l'UIPicker est situé en bas de l'écran.

On peut essayer de le déplacer légèrement vers le bas, mais la rangée centrale doit rester visible. Cela aidera à révéler un peu d'espace au-dessus du sélecteur car les lignes du bas seront hors écran.

Je répète que ce n'est pas la manière de changer la hauteur de la vue UIPicker mais une idée de ce que vous pouvez faire si toutes les autres tentatives échouent.

Sergey perdu
la source
1

Ok, après avoir longtemps lutté avec le stupide pickerview sous iOS 4, j'ai décidé de changer mon contrôle en simple tableau: voici le code:

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

Voici le fichier .h pour cela:

//
//  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];

c'est tout, il ne reste plus qu'à créer une variable membre dans la vue combobox qui contiendra la sélection de ligne actuelle, et nous sommes prêts à partir.

Profitez de tout le monde.

Alex
la source
voici ce qu'est VivatAwardsStruct, je reçois une erreur ici, VivatAwardsStruct non déclaré
Mahesh Babu
1

Vous ne pouvez généralement pas le faire dans xib ou définir le cadre par programme, mais si vous ouvrez son xib parent en tant que source et changez la hauteur à partir de là, cela fonctionne.Cliquez droit sur le xib dans lequel la vue de sélection est contenue, recherchez la vue de la sélection et vous pouvez trouver la hauteur, la largeur, etc. dans cette balise, modifiez la hauteur puis enregistrez le fichier.

<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>
iosdev1111
la source
0

Autant que je sache, il est impossible de réduire le UIPickerView. Je n'ai pas non plus vu de version plus courte utilisée nulle part. Je suppose que c'était une implémentation personnalisée s'ils réussissaient à la réduire.

NilObject
la source
Vous pouvez redimensionner uipickerview horizontalement, mais si vous le définissez trop court, cela entraînera des problèmes visuels.
futureelite7
0

Si vous souhaitez créer votre sélecteur dans IB, vous pouvez le post-redimensionner à une taille plus petite. Assurez-vous cependant qu'il dessine toujours correctement, car il arrive un moment où cela semble odieux.

Rob Winchester
la source
0

Swift : vous devez ajouter une sous-vue avec un clip aux limites

    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)

Cela devrait ajouter un sélecteur de date tronqué de 100 hauteurs en haut du contrôleur de vue.

Miika Pakarinen
la source
0

Mon truc: utilisez le calque de masque de datepicker pour rendre visible une partie de datePicker. comme vous le voyez, changez le cadre du 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;
}
franc
la source
0

J'utilise un calque de masque pour changer sa taille d'affichage

// 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
John Lee
la source
0

Incorporer dans une vue de pile. La vue Stack est un composant récemment ajouté par Apple dans son SDK iOS pour refléter les implémentations basées sur la grille dans les bibliothèques frontales basées sur le Web de script java telles que bootstrap.

user5590043
la source
0

Comme mentionné ci-dessus, il UIPickerViewest désormais redimensionnable. Je veux juste ajouter que si vous souhaitez modifier la hauteur du sélecteurView dans une cellule tableView, je n'ai pas réussi à définir l'ancre de hauteur sur une constante. Cependant, l'utilisation lessThanOrEqualToConstantsemble fonctionner.

 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)
     }

 }
MH175
la source
-1

Après une longue journée à me gratter la tête, j'ai trouvé quelque chose qui fonctionne pour moi. Les codes ci-dessous recréeront l'UIDatePicker chaque fois que l'utilisateur changera l'orientation du téléphone. Cela supprimera tous les problèmes que l'UIDatePicker a après un changement d'orientation.

Puisque nous recréons l'UIDatePicker, nous avons besoin d'une variable d'instance qui conservera la valeur de date sélectionnée. Les codes ci-dessous sont testés sur 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
chromeragnarok
la source
-1
stockPicker = [[UIPickerView alloc] init];
stockPicker.frame = CGRectMake(70.0,155, 180,100);

Si vous souhaitez définir la taille de UiPickerView. Le code ci-dessus fonctionnera sûrement pour vous.

Développeur
la source
-1

Dans iOS 5.0, les éléments suivants fonctionnent:

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

Cela a créé un sélecteur de date comme celui qu'Apple utilise dans l'application Calendrier lors de la création d'un nouvel événement en mode paysage. (3 lignes de haut au lieu de 5.) Cela n'a pas fonctionné lorsque j'ai défini le cadre dans la initWithFrame:méthode, mais fonctionne jusqu'à présent lorsque vous le définissez en utilisant une méthode distincte.

Mark Leonard
la source
-1

pour iOS 5:

si vous jetez un coup d'œil au protocole UIPickerView Référence

tu trouveras

 pickerView:rowHeightForComponent:
 pickerView:widthForComponent:

Je pense que c'est le premier que vous recherchez

Daniel
la source
pickerView:rowHeightForComponent:est la méthode déléguée pour décider de la hauteur de chaque ligne et non de la hauteur de la vue du sélecteur.
testée