Bagaimana mengubah tinggi UIPickerView


116

Apakah mungkin untuk mengubah ketinggian UIPickerView? Beberapa aplikasi tampaknya memiliki PickerView yang lebih pendek tetapi pengaturan frame yang lebih kecil tampaknya tidak berhasil dan frame tersebut terkunci di Interface Builder.


1
Jawaban tambahan dapat ditemukan dalam pertanyaan serupa: bagaimana cara mengecilkan tampilan picker di iPhone? .
Brad Larson

Jawaban:


54

Tampak jelas bahwa Apple tidak secara khusus mengundang penyia-nyiaan dengan tinggi default UIPickerView, tetapi saya telah menemukan bahwa Anda dapat mencapai perubahan ketinggian tampilan dengan mengambil kendali penuh dan meneruskan ukuran bingkai yang diinginkan pada waktu pembuatan, misalnya:

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

Anda akan menemukan bahwa pada berbagai ketinggian dan lebar, terdapat gangguan visual. Jelas, gangguan ini perlu diselesaikan entah bagaimana, atau memilih ukuran lain yang tidak menunjukkannya.


2
Ini bekerja untuk Anda? Semua UIPickerView yang saya contohkan tampaknya dikunci hingga ketinggian 215 ...
Andy Bourassa

Ini bekerja untuk saya. Apakah Anda menentukan tinggi yang dipersingkat dalam metode initWithFrame, seperti yang saya jelaskan? Mereka cenderung berjuang untuk tetap pada ketinggian tertentu, tetapi begitu saya menginisialisasi dengan bingkai pendek, itu berhasil. Jika Anda masih tidak dapat membuatnya berfungsi, saya akan melihat apakah saya dapat mengutip sampel.
danielpunkass

Apakah ada kontrol pihak ketiga yang memungkinkan pengubahan ukuran?
cfischer

1
Ini berhasil. 4.3. Saya init dengan frame dan setframe sebelum kemunculan pertama.
griotspeak

2
Saya terjebak dalam hal ini untuk sementara waktu. PENTING untuk dicatat bahwa Anda HARUS melakukan init dengan frame atau setframe sebelum kemunculan pertama atau Anda akan mendapatkan gangguan visual.
w. Donahue

46

Tak satu pun dari pendekatan di atas berfungsi di iOS 4.0

Tinggi pickerView tidak lagi dapat diubah ukurannya. Ada pesan yang dibuang ke konsol jika Anda mencoba mengubah bingkai alat pilih di 4.0:

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

Saya akhirnya melakukan sesuatu yang cukup radikal untuk mendapatkan efek picker yang lebih kecil yang berfungsi di OS 3.xx dan OS 4.0. Saya membiarkan alat pilih menjadi berapa pun ukuran yang diputuskan oleh SDK dan sebagai gantinya membuat jendela transparan tembus pandang pada gambar latar belakang saya di mana alat pilih tersebut menjadi terlihat. Kemudian cukup letakkan pemetik di belakang (Urutan Z) latar belakang UIImageView saya sehingga hanya sebagian pemetik yang terlihat yang ditentukan oleh jendela transparan di latar belakang saya.


44

Hanya ada tiga ketinggian yang valid untuk UIPickerView (162.0, 180.0 and 216.0).

Anda dapat menggunakan CGAffineTransformMakeTranslationdan CGAffineTransformMakeScalefungsi agar sesuai dengan alat pilih untuk kenyamanan Anda.

Contoh:

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

Kode di atas mengubah ketinggian tampilan pemetik menjadi setengah dan memposisikan ulang ke posisi tepat (Kiri-x1, Atas-y1) .


1
Jawaban yang bagus. Perhatikan bahwa untuk mengubah ketinggian alat pilih Anda tidak perlu menggunakan terjemahan: pickerview.transform = CGAffineTransformMakeScale (1.0, 0.5);
Borzh

2
Terima kasih. Tampaknya benar, tetapi apakah ada dokumentasi Apple tentang ketinggian yang valid?
Eric Chen

40

Mencoba:

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

2
Saya tahu saya terlambat ke pesta di sini - dan mungkin ada metode yang lebih baik yang ada sekarang untuk melakukan ini, tetapi ini berhasil untuk saya.
Hanny

Bekerja dengan baik! Untuk Swift (iOS 10) ini: statePicker.transform = CGAffineTransform (scaleX: 0.8, y: 0.8)
Meshach

25

Di iOS 4.2 & 4.3 bekerja berikut:

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

Berikut ini tidak berhasil:

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

Saya memiliki aplikasi yang ada di toko aplikasi dengan pemilih tanggal 3 baris. Saya pikir perubahan tinggi mungkin telah dicegah karena Anda melihat teks di bawah batas pemilih tanggal, tetapi ini juga terjadi pada pemilih tanggal ketinggian normal 216.

Yang mana bugnya? Tebakanmu sama bagusnya dengan tebakanku.

Juga ada 3 ketinggian yang valid untuk UIDatePicker(dan UIPickerView) 162.0, 180.0, dan 216.0. Jika Anda menyetel UIPickerViewketinggian ke hal lain, Anda akan melihat yang berikut di konsol saat melakukan debug pada perangkat iOS.

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

14

Mulai iOS 9, Anda dapat dengan bebas mengubah UIPickerViewlebar dan tinggi. Tidak perlu menggunakan peretasan transformasi yang disebutkan di atas.


perlu menentukan cara menambahkan inputAccessoryView ke UIPickerView dengan ukuran yang ditingkatkan.
DogCoffee

Berbagi pikiran bagaimana?
inmanl

10

Saya telah menemukan bahwa Anda dapat mengedit ukuran UIPickerView - tidak dengan pembuat antarmuka. buka file .xib dengan editor teks dan setel ukuran tampilan pemilih sesuai keinginan Anda. Pembuat antarmuka tidak mengatur ulang ukuran dan tampaknya berfungsi. Saya yakin apel mengunci ukuran karena suatu alasan sehingga Anda harus bereksperimen dengan ukuran yang berbeda untuk melihat apa yang berhasil.


7

Keuntungan:

  1. Membuat setFrame dari UIPickerView berperilaku seperti seharusnya
  2. Tidak ada kode transformasi dalam Anda UIViewController
  3. Bekerja dalam viewWillLayoutSubviewsuntuk mengubah skala / memposisikanUIPickerView
  4. Bekerja di iPad tanpa UIPopover
  5. Superkelas selalu menerima tinggi yang valid
  6. Bekerja dengan iOS 5

Kekurangan:

  1. Membutuhkan Anda untuk subclass UIPickerView
  2. Membutuhkan penggunaan pickerView viewForRow untuk mengurungkan transformasi untuk subTampilan
  3. UIAnimations mungkin tidak berfungsi

Larutan:

Subclass UIPickerView dan menimpa kedua metode menggunakan kode berikut. Ini menggabungkan subclassing, ketinggian tetap dan pendekatan transformasi.

#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

Cara mudah untuk mengubah tinggi tampilan alat pilih adalah dengan menyematkan alat pilih dalam UIView, menyesuaikan tinggi tampilan induk dengan tinggi yang ingin Anda lihat dari alat pilih, lalu aktifkan "Klip Subview" di Interface Builder pada induk UIView atau diatur view.clipsToBounds = truedalam kode.

Klip Subview di IB


dapatkah Anda memastikan bahwa ini benar-benar berfungsi? Pada xcode sepertinya itu tetapi berjalan di perangkat itu menunjukkan tampilan pemilih atas tampilan itu
nhenrique

1
Ini berfungsi @nhenrique, tetapi Anda tidak boleh lupa Clip Subviews. juga ukuran UIPickerViewharus lebih tinggi - dan Anda harus mengarahkan pusat Anda UIPickerViewagar terlihat di dalam orang tuaUIView
new2ios

Ide bagus, ini adalah solusi untuk saya di iOS 7.1.
Douglas Nassif Roma Junior

Ini tidak berfungsi, @ new2ios, dapatkah Anda mengonfirmasi bahwa ini berfungsi di iOS8>? Saya mencoba melakukan hal yang sama secara terprogram.
Hemang

Maaf, @hagile, tapi saya mengabaikan ide itu - saya tidak bisa memastikan. Saya menggunakan Storyboard (tidak membuat UIPickerViewdari kode).
new2ios

5

Saya tidak dapat mengikuti saran di atas.

Saya menonton banyak tutorial dan menemukan yang ini paling bermanfaat:

Saya menambahkan kode berikut untuk menyetel ketinggian baru di dalam metode "viewDidLoad", yang bekerja di aplikasi saya.

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

Semoga bermanfaat!


4

Ini telah banyak berubah di iOS 9 (di iOS 8 sangat mirip dengan apa yang kita lihat di sini). Jika Anda mampu menargetkan iOS 9 saja, maka Anda mengubah ukuran fileUIPickerView sesuai keinginan Anda, dengan mengatur bingkainya. Baik!

Ini dari Catatan Rilis iOS 9

UIPickerView dan UIDatePicker sekarang dapat diubah ukurannya dan adaptif — sebelumnya, tampilan ini akan memberlakukan ukuran default meskipun Anda mencoba mengubah ukurannya. Tampilan ini juga sekarang default ke lebar 320 poin di semua perangkat, bukan lebar perangkat di iPhone.

Antarmuka yang mengandalkan penegakan lama ukuran default kemungkinan akan terlihat salah saat dikompilasi untuk iOS 9. Masalah apa pun yang ditemui dapat diselesaikan dengan sepenuhnya membatasi atau mengubah ukuran tampilan alat pilih ke ukuran yang diinginkan alih-alih mengandalkan perilaku implisit.


2

Saya bekerja dengan ios 7, Xcode 5. Saya dapat menyesuaikan ketinggian pemilih tanggal secara tidak langsung dengan melampirkannya dalam tampilan. Ketinggian tampilan kontainer dapat disesuaikan.


Ini berfungsi selama saya menjalankannya di ios 7. Ketika saya menjalankan build yang sama ini di ios 6, seluruh picker muncul mengharapkan bagian yang ditimpa oleh view lain. Selama Anda hanya menargetkan> = 7 maka ini mungkin layak. Mengurutkan tampilan sedemikian rupa sehingga alat pilih dirender terlebih dahulu secara efektif menyembunyikan bagian luar, tetapi ini hanya menutupi dengan tampilan lain.
Doug Gerecht

Bisakah Anda menjelaskan sedikit lebih banyak tentang bagaimana ini dilakukan? Apakah ini hanya untuk memperkecil tampilan, atau dapatkah Anda memperbesar alat pilihnya? Saat ini sedang mengembangkan aplikasi iPad iOS 7 dan saya perlu memilih yang lebih tinggi, tetapi apa pun yang saya coba, saya tidak bisa membuatnya lebih besar!
Lizza

2

Buat tampilan di IB atau kode. Tambahkan alat pilih Anda sebagai subview dari tampilan ini. Ubah ukuran tampilan. Ini paling mudah dilakukan di IB. Buat batasan dari tampilan ke tampilan supernya dan dari alat pilih ke tampilan baru ini.

Karena kurva Picker di sekitarnya tumpah ke atas dan bawah tampilan. Anda dapat melihat di IB ketika Anda menambahkan batasan atas dan bawah dari alat pilih ke tampilan itu menunjukkan ruang standar sekitar 16 poin di atas dan di bawah wadah superview. Setel tampilan ke klip jika Anda tidak menginginkan perilaku ini (peringatan buruk).

Inilah yang terlihat pada 96 poin tinggi pada iPhone 5. Alat pilih dengan spillover tingginya sekitar 130 poin. Sangat kurus!

Saya menggunakan ini dalam proyek saya untuk mencegah pemetik menyebar ke ketinggian yang tidak perlu. Teknik ini memotongnya dan memaksa tumpahan yang lebih erat. Ini sebenarnya terlihat lebih licin untuk menjadi sedikit lebih kompak.

masukkan deskripsi gambar di sini

Berikut gambar tampilan yang menunjukkan spillover.

masukkan deskripsi gambar di sini

Inilah batasan IB yang saya tambahkan.

masukkan deskripsi gambar di sini


1

Meskipun ukurannya tidak berubah, trik lain dapat membantu dalam situasi ketika UIPicker terletak di bagian bawah layar.

Seseorang dapat mencoba memindahkannya sedikit ke bawah, tetapi baris tengah harus tetap terlihat. Ini akan membantu mengungkapkan beberapa ruang di atas alat pilih karena baris bawah akan berada di luar layar.

Saya ulangi bahwa ini bukan cara mengubah ketinggian tampilan UIPicker tetapi beberapa ide tentang apa yang dapat Anda lakukan jika semua upaya lain gagal.


1

Ok, setelah berjuang lama dengan pickerview bodoh di iOS 4, saya memutuskan untuk mengubah kontrol saya menjadi tabel sederhana: berikut kodenya:

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

Ini adalah file .h untuk itu:

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

itu saja, sekarang satu-satunya yang tersisa adalah membuat variabel anggota dalam tampilan kotak kombo yang akan menampung pemilihan baris saat ini, dan kita siap melakukannya.

Nikmati semuanya.


di sini apa itu VivatAwardsStruct, saya mendapatkan kesalahan di sini, VivatAwardsStruct tidak dideklarasikan
Mahesh Babu

1

Anda biasanya tidak dapat melakukannya di xib atau mengatur frame secara terprogram tetapi jika Anda membuka xib induknya sebagai sumber dan mengubah tinggi dari sana maka itu berfungsi. Klik kanan xib di mana pickerview berada, Cari pickerview dan Anda dapat menemukan tinggi, lebar, dll. di tag itu, Ubah tinggi di sana lalu simpan 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

Sejauh yang saya tahu, tidak mungkin mengecilkan UIPickerView. Saya juga belum pernah melihat yang lebih pendek digunakan di mana pun. Dugaan saya adalah bahwa itu adalah implementasi khusus jika mereka berhasil mengecilkannya.


Anda dapat mengubah ukuran uipickerview secara horizontal, tetapi jika Anda menyetelnya terlalu pendek akan menyebabkan gangguan visual.
futureelite7

0

Jika Anda ingin membuat picker Anda di IB, Anda dapat mengubah ukurannya ke ukuran yang lebih kecil. Periksa untuk memastikannya masih menggambar dengan benar, karena ada titik di mana itu terlihat mengerikan.


0

Swift : Anda perlu menambahkan subview dengan clip to bounds

    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)

Ini harus menambahkan pemilih tanggal 100 tinggi yang terpotong di bagian atas pengontrol tampilan.


0

Trik saya: gunakan layer mask datepicker untuk membuat datePicker beberapa bagian terlihat. seperti yang Anda lihat seperti mengubah bingkai 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

Saya menggunakan lapisan topeng untuk mengubah ukuran tampilan itu

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

Sematkan dalam tampilan tumpukan. Stack view adalah komponen yang baru-baru ini ditambahkan oleh Apple di iOS SDK mereka untuk mencerminkan implementasi berbasis grid di pustaka front end berbasis web java script seperti bootstrap.


0

Seperti disebutkan di atas UIPickerViewsekarang dapat diubah ukurannya. Saya hanya ingin menambahkan bahwa jika Anda ingin mengubah tinggi pickerView dalam sel tableView, saya tidak berhasil dengan mengatur jangkar ketinggian ke sebuah konstanta. Namun, penggunaan lessThanOrEqualToConstanttampaknya berhasil.

 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

Setelah seharian menggaruk-garuk kepala, saya menemukan sesuatu yang cocok untuk saya. Kode di bawah ini akan membuat ulang UIDatePicker setiap kali pengguna mengubah orientasi telepon. Ini akan menghapus gangguan apa pun yang dimiliki UIDatePicker setelah perubahan orientasi.

Karena kita membuat ulang UIDatePicker, kita membutuhkan variabel instan yang akan menyimpan nilai tanggal yang dipilih. Kode di bawah diuji pada 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);

Jika Anda ingin mengatur ukuran UiPickerView. Kode di atas pasti akan bekerja untuk Anda.


-1

Di iOS 5.0, saya mendapatkan yang berikut ini untuk bekerja:

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

Ini membuat pemilih tanggal seperti yang digunakan Apple di aplikasi Kalender saat membuat acara baru dalam mode lanskap. (Tinggi 3 baris, bukan 5.) Ini tidak berfungsi ketika saya mengatur bingkai dalam initWithFrame:metode, tetapi sejauh ini berfungsi saat mengaturnya menggunakan metode terpisah.


-1

untuk iOS 5:

jika Anda melihat sekilas UIPickerView Protocol Referensi

Anda akan menemukan

 pickerView:rowHeightForComponent:
 pickerView:widthForComponent:

Saya pikir ini yang pertama Anda cari


pickerView:rowHeightForComponent:adalah metode delegasi untuk menentukan tinggi setiap baris - bukan ketinggian tampilan alat pilih.
diuji
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.