So ändern Sie die UIPickerView-Höhe


116

Ist es möglich, die Höhe von UIPickerView zu ändern? Einige Anwendungen scheinen kürzere PickerViews zu haben, aber das Festlegen eines kleineren Frames scheint nicht zu funktionieren und der Frame ist im Interface Builder gesperrt.


1
Weitere Antworten finden Sie in einer ähnlichen Frage: Wie kann die Picker-Ansicht im iPhone verkleinert werden? .
Brad Larson

Antworten:


54

Es scheint offensichtlich, dass Apple nicht besonders zum Mucking mit der Standardhöhe von einlädt UIPickerView, aber ich habe festgestellt, dass Sie eine Änderung der Höhe der Ansicht erzielen können, indem Sie die vollständige Kontrolle übernehmen und beim Erstellen eine gewünschte Bildgröße übergeben, z.

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

Sie werden feststellen, dass es in verschiedenen Höhen und Breiten zu visuellen Störungen kommt. Offensichtlich müssten diese Störungen entweder irgendwie umgangen werden oder eine andere Größe wählen, die sie nicht aufweist.


2
Das funktioniert bei dir? Alle UIPickerViews, die ich instanziiere, scheinen auf eine Höhe von 215 gesperrt zu sein ...
Andy Bourassa

Für mich geht das. Geben Sie die verkürzte Höhe in der initWithFrame-Methode an, wie ich beschrieben habe? Sie neigen dazu zu kämpfen, um eine bestimmte Höhe zu bleiben, aber als ich mit einem kurzen Rahmen initialisiert habe, hat es funktioniert. Wenn Sie es immer noch nicht zum Laufen bringen können, werde ich sehen, ob ich eine Probe extrahieren kann.
Danielpunkass

Gibt es eine Kontrolle durch Dritte, die eine Größenänderung ermöglicht?
cfischer

1
Das hat funktioniert. 4.3. Ich initialisiere mit Frame und Setframe vor dem ersten Auftritt.
Griotspeak

2
Ich war eine Weile dabei. Es ist WICHTIG zu beachten, dass Sie vor dem ersten Auftreten mit Frame oder Setframe initialisieren MÜSSEN, da sonst visuelle Störungen auftreten.
w.donahue

46

Keiner der oben genannten Ansätze funktioniert in iOS 4.0

Die Höhe von pickerView kann nicht mehr geändert werden. Es gibt eine Nachricht, die an die Konsole ausgegeben wird, wenn Sie versuchen, den Frame eines Pickers in 4.0 zu ändern:

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

Am Ende habe ich etwas ziemlich Radikales getan, um den Effekt eines kleineren Pickers zu erzielen, der sowohl in OS 3.xx als auch in OS 4.0 funktioniert. Ich habe den Picker so gewählt, wie es das SDK vorschreibt, und stattdessen ein durchgeschnittenes transparentes Fenster auf meinem Hintergrundbild erstellt, durch das der Picker sichtbar wird. Dann platzieren Sie einfach den Picker hinter meinem Hintergrund UIImageView (in Z-Reihenfolge), sodass nur ein Teil des Pickers sichtbar ist, der durch das transparente Fenster in meinem Hintergrund vorgegeben wird.


44

Es gibt nur drei gültige Höhen für UIPickerView (162.0, 180.0 and 216.0).

Sie können die Verwendung CGAffineTransformMakeTranslationund CGAffineTransformMakeScaleFunktionen richtig die Picker auf Ihren Komfort passen.

Beispiel:

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

Mit dem obigen Code wird die Höhe der Auswahlansicht auf die Hälfte geändert und an der exakten Position (Links-x1, Oben-y1) neu positioniert.


1
Gute Antwort. Nur ein Hinweis, dass Sie zum Ändern der Pickerhöhe keine Übersetzung verwenden müssen: pickerview.transform = CGAffineTransformMakeScale (1.0, 0.5);
Borzh

2
Vielen Dank. Es scheint wahr zu sein, aber gibt es eine Apple-Dokumentation zu den gültigen Höhen?
Eric Chen

40

Versuchen:

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

2
Ich weiß, dass ich zu spät zur Party komme - und vielleicht gibt es jetzt bessere Methoden, um dies zu tun, aber das hat bei mir funktioniert.
Hanny

Funktioniert super! Für Swift (iOS 10) ist es: statePicker.transform = CGAffineTransform (scaleX: 0.8, y: 0.8)
Meshach

25

In iOS 4.2 und 4.3 funktioniert Folgendes:

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

Folgendes funktioniert nicht:

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

Ich habe eine App im App Store mit einer 3-Zeilen-Datumsauswahl. Ich dachte, die Höhenänderung wurde möglicherweise verhindert, weil Sie den Text unter dem Rand der Datumsauswahl sehen, aber dies passiert auch mit der normalen Datumsauswahl mit 216 Höhen.

Welches ist der Fehler? Deine Vermutung ist genauso gut wie meine.

Es gibt auch 3 gültige Höhen für UIDatePicker(und UIPickerView) 162.0, 180.0 und 216.0. Wenn Sie eine UIPickerViewandere Höhe festlegen , wird beim Debuggen auf einem iOS-Gerät in der Konsole Folgendes angezeigt.

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

14

Ab iOS 9 können Sie die UIPickerViewBreite und Höhe frei ändern . Die oben genannten Transformations-Hacks müssen nicht verwendet werden.


Sie müssen festlegen, wie eine inputAccessoryView zu einer vergrößerten UIPickerView hinzugefügt werden soll.
DogCoffee

Gedanken teilen wie?
Inmanl

10

Ich habe festgestellt , dass Sie können die Größe des UIPickerView bearbeiten - nur nicht mit Interface Builder. Öffnen Sie die XIB-Datei mit einem Texteditor und stellen Sie die Größe der Auswahlansicht auf die gewünschte Größe ein. Der Interface Builder setzt die Größe nicht zurück und scheint zu funktionieren. Ich bin mir sicher, dass Apple die Größe aus einem bestimmten Grund gesperrt hat, sodass Sie mit verschiedenen Größen experimentieren müssen, um zu sehen, was funktioniert.


7

Vorteile:

  1. Lässt setFrame UIPickerViewsich so verhalten, wie es sollte
  2. Kein Transformationscode in Ihrem UIViewController
  3. Arbeitet innerhalb, um die neu viewWillLayoutSubviewszu skalieren / zu positionierenUIPickerView
  4. Funktioniert auf dem iPad ohne UIPopover
  5. Die Oberklasse erhält immer eine gültige Höhe
  6. Funktioniert mit iOS 5

Nachteile:

  1. Erfordert eine Unterklasse UIPickerView
  2. Erfordert die Verwendung von pickerView viewForRow, um die Transformation für die Unteransichten rückgängig zu machen
  3. UIAnimations funktionieren möglicherweise nicht

Lösung:

Unterklasse UIPickerView und überschreiben Sie die beiden Methoden mit dem folgenden Code. Es kombiniert Unterklassen, feste Höhe und den Transformationsansatz.

#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

Eine einfache Möglichkeit, die sichtbare Höhe einer Auswahlansicht zu ändern, besteht darin, die Auswahl in eine UIView einzubetten, die Höhe der übergeordneten Ansicht an die Höhe anzupassen, die Sie für die Auswahl sehen möchten, und dann in der übergeordneten UIView im Schnittstellen-Generator "Clip-Unteransichten" zu aktivieren oder view.clipsToBounds = truein Code gesetzt.

Clip-Unteransichten in IB


Können Sie bestätigen, dass dies tatsächlich funktioniert? Auf xcode sieht es so aus, aber wenn es auf dem Gerät läuft, zeigt es den Pickerview über diesem uiview
nhenrique

1
Es funktioniert @nhenrique, aber Sie dürfen nicht vergessen Clip Subviews. Auch die Größe des UIPickerViewmuss größer sein - und Sie müssen auf die Mitte Ihres Ziels zielen UIPickerView, um im übergeordneten UIView
Element

Gute Idee, dies war die Lösung für mich in iOS 7.1.
Douglas Nassif Roma Junior

Dies funktioniert nicht, @ new2ios. Können Sie bestätigen, dass dies in iOS8 funktioniert? Ich versuche das gleiche programmgesteuert zu machen.
Hemang

Sorry, @hagile, aber ich gebe diese Idee auf - ich kann es nicht bestätigen. Ich benutze Storyboard (nicht UIPickerViewaus dem Code erstellt).
New2ios

5

Ich konnte keinem der oben genannten Ratschläge folgen.

Ich habe mir mehrere Tutorials angesehen und fand dieses am vorteilhaftesten:

Ich habe den folgenden Code hinzugefügt, um die neue Höhe innerhalb der "viewDidLoad" -Methode festzulegen, die in meiner App funktioniert hat.

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

Hoffe das war hilfreich!


4

Dies hat sich in iOS 9 stark geändert (in iOS 8 ist es ziemlich ähnlich zu dem, was wir hier sehen). Wenn Sie es sich leisten können, nur auf iOS 9 abzuzielen, ändern Sie die Größe nach Belieben UIPickerView, indem Sie den Rahmen festlegen. Gut!

Hier ist es von iOS 9 Release Notes

UIPickerView und UIDatePicker können jetzt in der Größe geändert und angepasst werden. Bisher haben diese Ansichten eine Standardgröße erzwungen, selbst wenn Sie versucht haben, die Größe zu ändern. Diese Ansichten haben jetzt standardmäßig eine Breite von 320 Punkten auf allen Geräten anstelle der Gerätebreite auf dem iPhone.

Schnittstellen, die auf der alten Durchsetzung der Standardgröße basieren, sehen beim Kompilieren für iOS 9 wahrscheinlich falsch aus. Alle aufgetretenen Probleme können behoben werden, indem die Auswahlansichten vollständig auf die gewünschte Größe beschränkt oder angepasst werden, anstatt sich auf implizites Verhalten zu verlassen.


2

Ich arbeite mit ios 7, Xcode 5. Ich konnte die Höhe der Datumsauswahl indirekt anpassen, indem ich sie in eine Ansicht einfügte. Die Höhe der Containeransichten kann angepasst werden.


Dies hat funktioniert, solange ich es auf iOS 7 ausgeführt habe. Wenn ich denselben Build auf iOS 6 ausführe, wird die gesamte Auswahl für Teile angezeigt, die von anderen Ansichten überschrieben werden. Solange Sie nur> = 7 anvisieren, kann dies sinnvoll sein. Wenn Sie die Ansichten so anordnen, dass der Picker zuerst gerendert wird, werden die äußeren Bereiche effektiv ausgeblendet, dies maskiert sie jedoch nur mit anderen Ansichten.
Doug Gerecht

Können Sie etwas mehr darüber erklären, wie das gemacht wurde? Ist dies nur zum Verkleinern der Ansicht oder können Sie den Picker auch vergrößern? Derzeit wird eine iOS 7 iPad-App entwickelt, und der Picker muss größer sein, aber egal was ich versuche, ich kann ihn nicht größer machen!
Lizza

2

Erstellen Sie eine Ansicht in IB oder Code. Fügen Sie Ihre Auswahl als Unteransicht dieser Ansicht hinzu. Ändern Sie die Größe der Ansicht. Dies ist in IB am einfachsten. Erstellen Sie Einschränkungen von der Ansicht zu ihrer Übersicht und von der Auswahl zu dieser neuen Ansicht.

Da sich der Picker um ihn herum krümmt, wird er über den oberen und unteren Rand der Ansicht verteilt. Sie können in IB sehen, wenn Sie der Ansicht obere und untere Einschränkungen aus der Auswahl hinzufügen. Es wird ein Standardbereich angezeigt, der etwa 16 Punkte über und unter dem Übersichtscontainer liegt. Stellen Sie die Ansicht so ein, dass sie abgeschnitten wird, wenn Sie dieses Verhalten nicht möchten (hässliche Warnung).

So sieht es bei 96 Punkten auf einem iPhone 5 aus. Der Picker mit dem Spillover ist ungefähr 130 Punkte hoch. Ziemlich dünn!

Ich verwende dies in meinem Projekt, um zu verhindern, dass sich der Picker auf eine unnötige Höhe ausbreitet. Diese Technik schneidet es ab und erzwingt ein engeres Überlaufen. Es sieht tatsächlich schlanker aus, etwas kompakter zu sein.

Geben Sie hier die Bildbeschreibung ein

Hier ist ein Bild der Ansicht, das den Überlauf zeigt.

Geben Sie hier die Bildbeschreibung ein

Hier sind die IB-Einschränkungen, die ich hinzugefügt habe.

Geben Sie hier die Bildbeschreibung ein


1

Auch wenn die Größe nicht geändert wird, kann ein anderer Trick in der Situation hilfreich sein, in der sich der UIPicker am unteren Bildschirmrand befindet.

Man kann versuchen, es leicht nach unten zu bewegen, aber die mittlere Reihe sollte sichtbar bleiben. Dies hilft dabei, etwas Platz über dem Picker freizulegen, da die unteren Reihen außerhalb des Bildschirms liegen.

Ich wiederhole, dass dies nicht die Art und Weise ist, die Höhe der UIPicker-Ansicht zu ändern, sondern eine Vorstellung davon, was Sie tun können, wenn alle anderen Versuche fehlschlagen.


1

Ok, nachdem ich lange mit dem blöden Pickerview in iOS 4 zu kämpfen hatte, habe ich beschlossen, mein Steuerelement in eine einfache Tabelle umzuwandeln: Hier ist der 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

Hier ist die .h-Datei dafür:

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

Jetzt müssen Sie nur noch eine Mitgliedsvariable in der Combobox-Ansicht erstellen, die die aktuelle Zeilenauswahl enthält, und wir können loslegen.

Genieße alle.


hier, was ist VivatAwardsStruct, ich bekomme Fehler hier, VivatAwardsStruct nicht deklariert
Mahesh Babu

1

Sie können dies im Allgemeinen nicht in xib tun oder den Rahmen programmgesteuert einstellen. Wenn Sie jedoch die übergeordnete xib als Quelle öffnen und die Höhe von dort aus ändern, funktioniert dies. Klicken Sie mit der rechten Maustaste auf die xib, in der pickerview enthalten ist, suchen Sie pickerview und finden Sie Höhe, Breite usw. Ändern Sie in diesem Tag die Höhe dort und speichern Sie die Datei.

<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

Soweit ich weiß, ist es unmöglich, die UIPickerView zu verkleinern. Ich habe auch noch keinen kürzeren gesehen, der irgendwo verwendet wird. Ich vermute, dass es eine benutzerdefinierte Implementierung war, wenn sie es geschafft haben, sie zu verkleinern.


Sie können die Größe von uipickerview horizontal ändern, aber wenn Sie es zu kurz einstellen, führt dies zu visuellen Störungen.
futureelite7

0

Wenn Sie Ihre Auswahl in IB erstellen möchten, können Sie die Größe auf eine kleinere Größe ändern. Stellen Sie sicher, dass es immer noch richtig gezeichnet wird, da es einen Punkt gibt, an dem es abscheulich aussieht.


0

Swift : Sie müssen eine Unteransicht mit Clip zu den Grenzen hinzufügen

    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)

Dadurch sollte oben im Ansichts-Controller eine abgeschnittene Datumsauswahl mit 100 Höhen hinzugefügt werden.


0

Mein Trick: Verwenden Sie die Maskenebene von Datepicker, um datePicker sichtbar zu machen. Wie Sie sehen, ändern Sie einfach den Rahmen des Datepickes.

- (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

Ich verwende eine Maskenebene, um die Anzeigegröße zu ändern

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

In eine Stapelansicht einbetten. Die Stapelansicht ist eine Komponente, die Apple kürzlich in seinem iOS SDK hinzugefügt hat, um gitterbasierte Implementierungen in webbasierten Java-Skript-Front-End-Bibliotheken wie Bootstrap widerzuspiegeln.


0

Wie oben erwähnt, kann die UIPickerViewGröße jetzt geändert werden. Ich möchte nur hinzufügen, dass ich keinen Erfolg damit hatte, den Höhenanker auf eine Konstante zu setzen, wenn Sie die Höhe von pickerView in einer tableView-Zelle ändern möchten. Die Verwendung lessThanOrEqualToConstantscheint jedoch zu funktionieren.

 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

Nach einem langen Tag, an dem ich mich am Kopf gekratzt habe, habe ich etwas gefunden, das für mich funktioniert. Die folgenden Codes erstellen den UIDatePicker jedes Mal neu, wenn der Benutzer die Ausrichtung des Telefons ändert. Dadurch werden alle Störungen beseitigt, die der UIDatePicker nach einer Orientierungsänderung aufweist.

Da wir den UIDatePicker neu erstellen, benötigen wir eine Instanzvariable, die den ausgewählten Datumswert beibehält. Die folgenden Codes werden unter iOS 4.0 getestet.

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

Wenn Sie die Größe von UiPickerView festlegen möchten. Der obige Code wird sicherlich für dich funktionieren.


-1

In iOS 5.0 funktionierte Folgendes:

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

Dadurch wurde eine Datumsauswahl erstellt, wie sie Apple in der Kalender-App verwendet, wenn ein neues Ereignis im Querformat erstellt wird. (3 Zeilen hoch statt 5.) Dies hat nicht funktioniert, als ich den Frame innerhalb der initWithFrame:Methode festgelegt habe, aber bisher funktioniert es, wenn ich ihn mit einer separaten Methode festgelegt habe.


-1

für iOS 5:

wenn Sie einen kurzen Blick auf die UIPickerView Protocol Reference

du wirst es finden

 pickerView:rowHeightForComponent:
 pickerView:widthForComponent:

Ich denke, es ist der erste, den Sie suchen


pickerView:rowHeightForComponent:ist die Delegatmethode, um die Höhe jeder Zeile zu bestimmen - nicht die Höhe der Auswahlansicht.
Turing getestet
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.