UIPickerView yüksekliği nasıl değiştirilir


116

UIPickerView yüksekliğini değiştirmek mümkün mü? Bazı uygulamalarda daha kısa PickerViews var gibi görünüyor, ancak daha küçük bir çerçeve ayarlamak işe yaramıyor ve çerçeve Arabirim Oluşturucu'da kilitlendi.


1
Benzer bir soruda ek yanıtlar bulunabilir: iPhone'da seçici görünümü nasıl küçültülür? .
Brad Larson

Yanıtlar:


54

Görünüşe göre Apple'ın özellikle varsayılan yüksekliğiyle karıştırmaya davet etmediği açık görünüyor UIPickerView, ancak tam kontrolü ele alarak ve oluşturma sırasında istenen bir çerçeve boyutunu geçerek görünümün yüksekliğinde bir değişiklik elde edebileceğinizi buldum , örneğin:

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

Çeşitli yükseklik ve genişliklerde görsel aksaklıklar olduğunu keşfedeceksiniz. Açıkçası, bu aksaklıkların ya bir şekilde çözülmesi ya da bunları sergilemeyen başka bir boyut seçilmesi gerekir.


2
Bu senin için çalışıyor mu? Örneklediğim tüm UIPickerViews 215 yüksekliğe kilitlenmiş görünüyor ...
Andy Bourassa

Benim için çalışıyor. Kısaltılmış yüksekliği initWithFrame yönteminde anlattığım gibi mi belirliyorsunuz? Belli bir boyda kalmak için savaşma eğilimindeler, ancak kısa bir çerçeve ile başlattığımda işe yaradı. Hala işe yaramazsa, bir örnek alabilir miyim bir bakayım.
danielpunkass

Yeniden boyutlandırmaya izin veren herhangi bir üçüncü taraf kontrolü var mı?
cfischer

1
Bu işe yaradı. 4.3. İlk görünümden önce çerçeve ve setframe ile başlıyorum.
griotspeak

2
Bir süre buna takılı kaldım. İlk görünümden önce çerçeve veya setframe ile başlatmanız GEREKİR, aksi takdirde görsel aksaklıklar yaşarsınız.
w.donahue

46

Yukarıdaki yaklaşımlardan hiçbiri iOS 4.0'da çalışmaz

PickerView'ın yüksekliği artık yeniden boyutlandırılamaz. 4.0'da bir seçicinin çerçevesini değiştirmeye çalışırsanız konsola atılan bir mesaj var:

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

Hem OS 3.xx hem de OS 4.0'da çalışan daha küçük bir seçicinin etkisini elde etmek için oldukça radikal bir şey yaptım. Seçiciyi, SDK'nın olması gerektiğine karar verdiği boyutta bıraktım ve bunun yerine, arka plan resmimde seçicinin görünür hale gelmesini sağlayan şeffaf bir kesik pencere yaptım. Ardından, seçiciyi arka planımın arkasına yerleştirin (Z Sıralamasıyla) UIImageView, böylece arka planımdaki şeffaf pencere tarafından dikte edilen seçicinin yalnızca bir kısmı görünür.


44

İçin yalnızca üç geçerli yükseklik vardır UIPickerView (162.0, 180.0 and 216.0).

Seçiciyi size kolaylık sağlayacak şekilde yerleştirmek için CGAffineTransformMakeTranslationve CGAffineTransformMakeScaleişlevlerini kullanabilirsiniz .

Misal:

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

Yukarıdaki kod, seçici görünümün yüksekliğini yarıya değiştirir ve tam (Sol-x1, Üst-y1) konumuna yeniden konumlandırır.


1
Mükemmel cevap. Seçici yüksekliğini değiştirmek için çeviriyi kullanmanız gerekmediğini unutmayın: pickerview.transform = CGAffineTransformMakeScale (1.0, 0.5);
Borzh

2
Teşekkürler. Doğru görünüyor, ancak geçerli yüksekliklerde herhangi bir Apple belgesi var mı?
Eric Chen

40

Deneyin:

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

2
Buradaki partiye geç kaldığımı biliyorum - ve belki şimdi bunu yapmak için daha iyi yöntemler var, ama bu benim için çalıştı.
Hanny

Harika çalışıyor! Swift (iOS 10) için: statePicker.transform = CGAffineTransform (scaleX: 0.8, y: 0.8)
Meshach

25

İOS 4.2 ve 4.3'te aşağıdakiler çalışır:

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

Aşağıdakiler çalışmıyor:

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

Uygulama mağazasında 3 satırlık tarih seçiciye sahip bir uygulamam var. Tarih seçicinin kenarlığının altındaki metni gördüğünüz için yükseklik değişikliğinin engellenmiş olabileceğini düşündüm, ancak bu normal 216 yükseklik tarih seçicisine de oluyor.

Hata hangisi? Tahminin benimki kadar iyi.

Ayrıca UIDatePicker(ve UIPickerView) 162.0, 180.0 ve 216.0 için 3 geçerli yükseklik vardır . Başka bir UIPickerViewşeye yükseklik ayarlarsanız , bir iOS cihazında hata ayıklarken konsolda aşağıdakileri göreceksiniz.

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

14

İOS 9'dan itibaren UIPickerViewgenişliğini ve yüksekliğini özgürce değiştirebilirsiniz . Yukarıda belirtilen dönüşüm saldırılarını kullanmaya gerek yok.


daha büyük boyutlu bir UIPickerView'a bir inputAccessoryView eklemeyi belirlemeniz gerekir.
DogCoffee

Nasıl paylaşırsın?
inmanl

10

Bunu bulduk edebilirsiniz değil sadece arayüz oluşturucu ile - UIPickerView boyutunu düzenleyin. .xib dosyasını bir metin düzenleyiciyle açın ve seçici görünümünün boyutunu istediğiniz gibi ayarlayın. Arayüz oluşturucu boyutu sıfırlamıyor ve çalışıyor gibi görünüyor. Eminim elma bir sebepten dolayı boyutu kilitledi, bu yüzden neyin işe yaradığını görmek için farklı boyutlarla denemeniz gerekecek.


7

Avantajları:

  1. SetFrame'in UIPickerViewolması gerektiği gibi davranmasını sağlar
  2. İçinde dönüşüm kodu yok UIViewController
  3. viewWillLayoutSubviewsYeniden ölçeklendirmek / konumlandırmak için içinde çalışırUIPickerView
  4. İPad'de olmadan çalışır UIPopover
  5. Üst sınıf her zaman geçerli bir yükseklik alır
  6. İOS 5 ile çalışır

Dezavantajları:

  1. Alt sınıfa girmenizi gerektirir UIPickerView
  2. pickerView viewForRowAlt görünümler için dönüşümü geri almak için kullanılmasını gerektirir
  3. UIAnimations çalışmayabilir

Çözüm:

Alt sınıf UIPickerView ve aşağıdaki kodu kullanarak iki yöntemin üzerine yazın. Alt sınıflandırma, sabit yükseklik ve dönüştürme yaklaşımını birleştirir.

#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

Bir seçici görünümün görünür yüksekliğini değiştirmenin kolay bir yolu, seçiciyi bir UIView içine yerleştirmek, üst görünümün yüksekliğini seçicide görmek istediğiniz yüksekliğe ayarlamak ve ardından üst UIView'deki Arayüz Oluşturucu'da "Klip Alt Görünümleri" ni etkinleştirmektir. veya view.clipsToBounds = truekod olarak ayarlayın .

IB'de Klip Alt Görünümleri


bunun gerçekten çalıştığını doğrulayabilir misin? Xcode'da buna benziyor ama cihazda çalışıyor o uiview üzerinden seçim görüntüsünü gösteriyor
nhenrique

1
@Nhenrique çalışıyor, ama unutmamalısın Clip Subviews. ayrıca boyu UIPickerViewdaha uzun olmalıdır - ve sizin merkezinizin UIPickerViewebeveynin içinde görünmesini UIView
hedeflemelisiniz

İyi fikir, bu benim için iOS 7.1'deki çözümdü.
Douglas Nassif Roma Junior

Bu çalışmıyor, @ new2ios, bunun iOS8'de çalıştığını onaylayabilir misiniz>? Aynı şeyi programlı olarak yapmaya çalışıyorum.
Hemang

Üzgünüm @hagile, ama bu fikri terk ediyorum - teyit edemiyorum. Storyboard kullanıyorum ( UIPickerViewkoddan oluşturmadım ).
new2ios

5

Yukarıdaki tavsiyelerin hiçbirine uyamadım.

Birden fazla öğretici izledim ve bunu en faydalı buldum :

Uygulamamda çalışan "viewDidLoad" yönteminin içine yeni yüksekliği ayarlamak için aşağıdaki kodu ekledim.

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

Umarım bu yardımcı olmuştur!


4

Bu, iOS 9'da çok değişti (iOS 8'de burada gördüğümüze oldukça benzer). Yalnızca iOS 9'u hedeflemeyi göze alabiliyorsanız UIPickerView, çerçevesini ayarlayarak uygun gördüğünüz şekilde yeniden boyutlandırırsınız . İyi!

İşte iOS 9 Sürüm Notlarından

UIPickerView ve UIDatePicker artık yeniden boyutlandırılabilir ve uyarlanabilir - daha önce, bu görünümler, onları yeniden boyutlandırmayı deneseniz bile varsayılan bir boyutu zorlardı. Bu görünümler artık iPhone'daki cihaz genişliği yerine tüm cihazlarda varsayılan olarak 320 nokta genişliğine sahip.

Varsayılan boyutun eski uygulamasına dayanan arayüzler, iOS 9 için derlendiğinde muhtemelen yanlış görünecektir. Karşılaşılan tüm sorunlar, örtülü davranışa dayanmak yerine seçici görünümlerini istenen boyuta tamamen sınırlayarak veya boyutlandırarak çözülebilir.


2

İos 7, Xcode 5 ile çalışıyorum. Tarih seçicinin yüksekliğini dolaylı olarak bir görünüm içine alarak ayarlayabildim. Konteyner görünümlerinin yüksekliği ayarlanabilir.


Bu, ios 7'de çalıştırdığım sürece işe yaradı. Aynı yapıyı ios 6'da çalıştırdığımda, tüm seçici, diğer görünümler tarafından üzerine yazılan bölümler için beklediğini gösteriyor. Yalnızca> = 7'yi hedeflediğiniz sürece bu geçerli olabilir. Görünümlerin, seçicinin ilk olarak işleneceği şekilde sıralanması, dışarıdaki bölümleri etkili bir şekilde gizler, ancak bu yalnızca onu diğer görünümlerle maskelemektir.
Doug Gerecht

Bunun nasıl yapıldığına dair biraz daha açıklayabilir misin? Bu sadece görünümü küçültmek için mi yoksa toplayıcıyı da büyütebilir misin? Şu anda bir iOS 7 iPad uygulaması geliştiriyorum ve seçicinin daha uzun olması gerekiyor, ancak ne denersem deneyeyim daha da büyütemiyorum!
Lizza

2

IB veya kodda bir görünüm oluşturun. Seçicinizi bu görünümün bir alt görünümü olarak ekleyin. Görünümü yeniden boyutlandırın. Bu IB'de yapılması en kolay yoldur. Görünümden gözetimine ve seçiciden bu yeni görünüme kadar kısıtlamalar oluşturun.

Seçici etrafında kıvrıldığından, görünümün üstüne ve altına dökülür. Seçiciden görünüme üst ve alt sınırlamalar eklediğinizde, IB'de, denetleme kabının üstünde ve altında 16 nokta gibi standart bir alan gösterdiğini görebilirsiniz. Bu davranışı istemiyorsanız görünümü kırpacak şekilde ayarlayın (çirkin uyarı).

İşte bir iPhone 5'te 96 puan yüksekte göründüğü gibi. Yayılmaya sahip seçici, yaklaşık 130 puan yüksek. Oldukça sıska!

Bunu projemde toplayıcının gereksiz bir yüksekliğe yayılmasını önlemek için kullanıyorum. Bu teknik onu keser ve daha sıkı bir dökülmeye zorlar. Aslında biraz daha kompakt olması daha düzgün görünüyor.

görüntü açıklamasını buraya girin

İşte yayılmayı gösteren bir görüntü.

görüntü açıklamasını buraya girin

İşte eklediğim IB kısıtlamaları.

görüntü açıklamasını buraya girin


1

Yeniden boyutlandırılmadığı düşünülse bile, UIPicker'ın ekranın alt kısmında olduğu durumda başka bir numara yardımcı olabilir.

Biraz aşağı doğru hareket ettirmeyi deneyebilirsiniz, ancak orta sıra görünür kalmalıdır. Bu, alt sıralar ekran dışında olacağından seçicinin üzerinde biraz boşluk ortaya çıkarmanıza yardımcı olacaktır.

Tekrar ediyorum, UIPicker görünümünün yüksekliğini değiştirmenin yolu bu değil, ancak diğer tüm girişimler başarısız olursa ne yapabileceğinize dair bir fikir.


1

Tamam, iOS 4'teki aptal seçim görüntüleme ile uzun süre uğraştıktan sonra, kontrolümü basit bir tabloya dönüştürmeye karar verdim: işte kod:

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

İşte bunun için .h dosyası:

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

işte bu, şimdi geriye kalan tek şey, birleşik giriş kutusu görünümünde mevcut satır seçimini tutacak bir üye değişkeni oluşturmak ve gitmeye hazırız.

Herkesin tadını çıkarın.


VivatAwardsStruct nedir burada, burada hata alıyorum, VivatAwardsStruct bildirilmemiş
Mahesh Babu

1

Bunu genellikle xib'de ya da çerçeveyi programlı olarak ayarlayamazsınız, ancak ana xib'i kaynak olarak açıp yüksekliğini oradan değiştirirseniz, o zaman çalışır. Bu etikette, yüksekliği oradan değiştirin ve ardından dosyayı kaydedin.

<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

Bildiğim kadarıyla, UIPickerView'ı küçültmek imkansız. Ayrıca hiçbir yerde kullanılan daha kısa bir tane görmedim. Tahminim, onu küçültmeyi başardılarsa, özel bir uygulamaydı.


Uipickerview'i yatay olarak yeniden boyutlandırabilirsiniz, ancak çok kısa ayarlarsanız görsel hatalara neden olur.
futureelite7

0

Seçicinizi IB'de oluşturmak istiyorsanız, daha küçük bir boyuta sonradan yeniden boyutlandırabilirsiniz. İğrenç göründüğü bir nokta geldiğinden, yine de doğru çizdiğinden emin olmak için kontrol edin.


0

Swift : Sınırlara klibi olan bir alt görünüm eklemeniz gerekiyor

    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)

Bu, görünüm denetleyicisinin üst kısmına kırpılmış 100 yüksekliğinde bir tarih seçici eklemelidir.


0

Benim numaram: datePicker'ın bir kısmını görünür kılmak için datepicker'ın maske katmanını kullanın. tıpkı tarih çubuğunun çerçevesini değiştirmek gibi.

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

Görüntü boyutunu değiştirmek için bir maske katmanı kullanıyorum

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

Yığın görünümüne gömün. Yığın görünümü, önyükleme gibi java betiği web tabanlı ön uç kitaplıklarındaki ızgara tabanlı uygulamaları yansıtmak için yakın zamanda Apple tarafından iOS SDK'larına eklenen bir bileşendir.


0

Yukarıda belirtildiği gibi UIPickerViewartık yeniden boyutlandırılabilir. Bir tableView Hücresinde pickerView'ün yüksekliğini değiştirmek isterseniz, yükseklik çapasını bir sabit olarak ayarlamada herhangi bir başarı elde edemediğimi eklemek istiyorum. Ancak, kullanmak lessThanOrEqualToConstantişe yarıyor gibi görünüyor.

 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

Kafamı kaşımakla geçen uzun bir günün ardından, benim için işe yarayan bir şey buldum. Aşağıdaki kodlar, kullanıcı telefon yönünü her değiştirdiğinde UIDatePicker'ı yeniden oluşturacaktır. Bu, bir yönelim değişikliğinden sonra UIDatePicker'ın sahip olduğu hataları ortadan kaldıracaktır.

UIDatePicker'ı yeniden oluşturduğumuz için, seçilen tarih değerini koruyacak bir örnek değişkenine ihtiyacımız var. Aşağıdaki kodlar iOS 4.0'da test edilmiştir.

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

UiPickerView boyutunu ayarlamak istiyorsanız. Yukarıdaki kod kesinlikle sizin için çalışacaktır.


-1

İOS 5.0'da çalışmak için aşağıdakileri aldım:

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

Bu, Apple'ın Takvim uygulamasında yatay modda yeni bir etkinlik oluştururken kullandığı gibi bir tarih seçici oluşturdu. (5 yerine 3 satır yüksek) Bu, çerçeveyi initWithFrame:yöntem içinde ayarladığımda işe yaramadı , ancak şu ana kadar ayrı bir yöntem kullanarak ayarlarken çalışıyor.


-1

iOS 5 için:

UIPickerView Protokol Referansına hızlıca bakarsanız

bulacaksın

 pickerView:rowHeightForComponent:
 pickerView:widthForComponent:

Bence aradığın ilk kişi


pickerView:rowHeightForComponent:seçici görünümün yüksekliğine değil, her satırın yüksekliğine karar veren temsilci yöntemidir.
2017
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.