Jak zmienić wysokość UIPickerView

Odpowiedzi:

54

Wydaje się oczywiste, że Apple nie zachęca szczególnie do mucking z domyślną wysokością UIPickerView, ale odkryłem, że możesz osiągnąć zmianę wysokości widoku, przejmując pełną kontrolę i przekazując żądany rozmiar klatki w czasie tworzenia, np .:

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

Przekonasz się, że na różnych wysokościach i szerokościach występują wizualne usterki. Oczywiście te usterki należałoby jakoś obejść lub wybrać inny rozmiar, który ich nie wykazuje.

danielpunkass
źródło
2
To działa dla Ciebie? Wszystkie instancje UIPickerViews, które tworzę, wydają się być zablokowane do wysokości 215 ...
Andy Bourassa
Mi to pasuje. Czy określasz skróconą wysokość w metodzie initWithFrame, tak jak opisałem? Zwykle walczą o utrzymanie określonej wysokości, ale kiedy zainicjowałem z krótką ramką, zadziałało. Jeśli nadal nie możesz zmusić go do działania, zobaczę, czy mogę wyciąć próbkę.
danielpunkass
Czy istnieje kontrola strony trzeciej, która umożliwia zmianę rozmiaru?
cfischer
1
To zadziałało. 4.3. Inituję z ramą i setframe przed pierwszym pojawieniem się.
griotspeak
2
Utknąłem w tym na chwilę. WAŻNE jest, aby pamiętać, że MUSISZ zainicjować go z ramką lub ramką przed pierwszym pojawieniem się, w przeciwnym razie wystąpią wizualne usterki.
Donahue,
46

Żadne z powyższych podejść nie działa w iOS 4.0

Nie można już zmieniać rozmiaru wysokości pickerView. Jest komunikat, który zostaje zrzucony do konsoli, jeśli spróbujesz zmienić ramkę selektora w 4.0:

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

Skończyło się na tym, że zrobiłem coś dość radykalnego, aby uzyskać efekt mniejszego selektora, który działa zarówno w systemie 3.xx, jak i OS 4.0. Zostawiłem selektor na dowolny rozmiar, który SDK zdecyduje, i zamiast tego utworzyłem przezroczyste okno na moim obrazie tła, przez które staje się widoczny. Następnie po prostu umieść selektor za (w kolejności Z) moim tłem UIImageView, tak aby widoczna była tylko część selektora, co jest podyktowane przezroczystym oknem w moim tle.

bhavinb
źródło
44

Istnieją tylko trzy ważne wysokości UIPickerView (162.0, 180.0 and 216.0).

Możesz użyć funkcji CGAffineTransformMakeTranslationi, CGAffineTransformMakeScaleaby odpowiednio dopasować selektor dla swojej wygody.

Przykład:

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

Powyższy kod zmienia wysokość widoku selektora na połowę i ponownie ustawia go na dokładnej pozycji (Left-x1, Top-y1) .

JRSee
źródło
1
Świetna odpowiedź. Tylko uwaga, aby zmienić wysokość selektora, nie trzeba używać tłumaczenia: pickerview.transform = CGAffineTransformMakeScale (1.0, 0.5);
Borzh
2
Dzięki. Wydaje się, że to prawda, ale czy istnieje dokumentacja Apple dotycząca prawidłowych wysokości?
Eric Chen
40

Próbować:

pickerview.transform = CGAffineTransformMakeScale(.5, 0.5);
vijay adhikari
źródło
2
Wiem, że spóźniłem się na przyjęcie tutaj - i być może istnieją lepsze metody, które istnieją teraz, aby to zrobić, ale to zadziałało dla mnie.
Hanny
Działa świetnie! Dla Swift (iOS 10) to: statePicker.transform = CGAffineTransform (scaleX: 0.8, y: 0.8)
Meshach
25

W iOS 4.2 i 4.3 działa to:

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

Nie działa:

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

Mam aplikację w sklepie z aplikacjami z 3-wierszowym selektorem dat. Wydawało mi się, że można było zapobiec zmianie wysokości, ponieważ tekst znajduje się pod obramowaniem selektora dat, ale dzieje się tak również w przypadku normalnego selektora dat o wysokości 216.

Jaki jest błąd? Twoje przypuszczenia są równie dobre jak moje.

Istnieją również 3 ważne wysokości dla UIDatePicker(i UIPickerView) 162,0, 180,0 i 216,0. Jeśli ustawisz UIPickerViewwysokość na cokolwiek innego, zobaczysz następujące informacje w konsoli podczas debugowania na urządzeniu z systemem iOS.

2011-09-14 10:06:56.180 DebugHarness[1717:707] -[UIPickerView setFrame:]: invalid height value 300.0 pinned to 216.0
mmorris
źródło
14

Od iOS 9 możesz dowolnie zmieniać UIPickerViewszerokość i wysokość. Nie ma potrzeby korzystania z wyżej wymienionych hacków transformacji.

rounak
źródło
trzeba określić, jak dodać inputAccessoryView do UIPickerView o zwiększonym rozmiarze.
DogCoffee
Jak dzielić się myślami?
inmanl
10

I odkryli, że można zmieniać wielkość UIPickerView - nie tylko z interfejsem budowniczego. otwórz plik .xib w edytorze tekstu i ustaw dowolny rozmiar widoku selektora. Konstruktor interfejsu nie resetuje rozmiaru i wydaje się działać. Jestem pewien, że Apple zablokowało rozmiar z jakiegoś powodu, więc będziesz musiał eksperymentować z różnymi rozmiarami, aby zobaczyć, co działa.


źródło
7

Zalety:

  1. Sprawia, że ​​setFrame UIPickerViewzachowuje się tak, jak powinno
  2. Brak kodu transformacji w Twoim UIViewController
  3. Działa w ramach, viewWillLayoutSubviewsaby przeskalować / ustawićUIPickerView
  4. Działa na iPadzie bez UIPopover
  5. Nadklasa zawsze otrzymuje prawidłową wysokość
  6. Działa z iOS 5

Niedogodności:

  1. Wymaga podklasy UIPickerView
  2. Wymaga użycia, pickerView viewForRowaby cofnąć transformację dla podwidoków
  3. UIAnimations może nie działać

Rozwiązanie:

Podklasa UIPickerView i Zastąp te dwie metody przy użyciu następującego kodu. Łączy podklasy, stałą wysokość i podejście transformacyjne.

#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
źródło
7

Łatwym sposobem na zmianę widocznej wysokości widoku selektora jest osadzenie selektora w UIView, dostosowanie wysokości widoku nadrzędnego do wysokości, którą chcesz widzieć selektora, a następnie włączenie „Clip Subviews” w Interface Builder w nadrzędnym UIView lub view.clipsToBounds = truew kodzie.

Podglądy klipów w IB

svarrall
źródło
czy możesz potwierdzić, że to faktycznie działa? W xcode wygląda na to, ale działa na urządzeniu, pokazuje widok
pickerviewu
1
Działa @nhenrique, ale nie możesz zapomnieć Clip Subviews. również rozmiar UIPickerViewmusi być wyższy - i musisz wycelować w środek swojego, UIPickerViewaby był widoczny wewnątrz rodzicaUIView
new2ios
Dobry pomysł, to było dla mnie rozwiązanie w iOS 7.1.
Douglas Nassif Roma Junior
To nie działa, @ new2ios, czy możesz potwierdzić, że to działa w iOS8>? Próbuję zrobić to samo programowo.
Hemang,
Przepraszam @hagile, ale porzucam ten pomysł - nie mogę potwierdzić. Używam Storyboard (nie utworzono UIPickerViewz kodu).
new2ios
5

Nie mogłem zastosować się do żadnej z powyższych rad.

Obejrzałem wiele samouczków i uznałem, że ten jest najbardziej korzystny:

Dodałem następujący kod, aby ustawić nową wysokość w metodzie „viewDidLoad”, która działała w mojej aplikacji.

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

Mam nadzieję, że to było pomocne!

erran
źródło
4

To bardzo się zmieniło w iOS 9 (w iOS 8 jest bardzo podobne do tego, co widzimy tutaj). Jeśli możesz sobie pozwolić na kierowanie tylko na iOS 9, zmień rozmiar UIPickerViewwedług własnego uznania, ustawiając jego ramkę. Dobry!

Tutaj pochodzi z informacji o wydaniu iOS 9

UIPickerView i UIDatePicker są teraz skalowalne i adaptacyjne - wcześniej te widoki wymuszały domyślny rozmiar, nawet jeśli próbowałeś zmienić ich rozmiar. Te widoki również teraz domyślnie mają szerokość 320 punktów na wszystkich urządzeniach, zamiast szerokości urządzenia na iPhonie.

Interfejsy, które opierają się na starym wymuszaniu domyślnego rozmiaru, prawdopodobnie będą wyglądać nieprawidłowo po skompilowaniu dla systemu iOS 9. Wszelkie napotkane problemy można rozwiązać, całkowicie ograniczając lub zmieniając rozmiar widoków selektora do żądanego rozmiaru, zamiast polegać na niejawnym zachowaniu.

Dan Rosenstark
źródło
2

Pracuję z ios 7, Xcode 5. Udało mi się pośrednio dostosować wysokość selektora dat, zamykając go w widoku. Wysokość widoków kontenerów można regulować.

serverman
źródło
To działało tak długo, jak uruchomiłem go na ios 7. Kiedy uruchamiam tę samą kompilację na ios 6, cały selektor pojawia się, oczekując fragmentów, które są nadpisywane przez inne widoki. Dopóki celujesz tylko w> = 7, może to być wykonalne. Uporządkowanie widoków w taki sposób, aby selektor był renderowany jako pierwszy, skutecznie ukrywa odległe części, ale powoduje to tylko maskowanie go innymi widokami.
Doug Gerecht,
Czy możesz wyjaśnić trochę więcej o tym, jak to zostało zrobione? Czy to tylko po to, aby zmniejszyć widok, czy też możesz powiększyć selektor? Obecnie rozwijam aplikację iOS 7 na iPada i potrzebuję, aby selektor był wyższy, ale bez względu na to, co próbuję, nie mogę go zwiększyć!
Lizza
2

Utwórz widok w IB lub w kodzie. Dodaj selektor jako widok podrzędny tego widoku. Zmień rozmiar widoku. Najłatwiej to zrobić w IB. Utwórz ograniczenia z widoku do jego nadzoru i od selektora do tego nowego widoku.

Ponieważ Picker zakrzywia się wokół, rozlewa się na górę i dół widoku. Możesz zobaczyć w IB, kiedy dodasz górne i dolne ograniczenia z selektora do widoku, pokazuje on standardową przestrzeń, około 16 punktów powyżej i poniżej kontenera Superview. Ustaw widok tak, aby go przyciąć, jeśli nie chcesz tego zachowania (brzydkie ostrzeżenie).

Oto, jak to wygląda przy 96 punktach wysokości na iPhonie 5. Picker z efektem spillover ma około 130 punktów wysokości. Całkiem chudy!

Używam tego w moim projekcie, aby zapobiec rozszerzaniu się zbieracza na niepotrzebną wysokość. Ta technika przycina go i wymusza ciaśniejszy wyciek. W rzeczywistości wygląda na bardziej zwartą.

wprowadź opis obrazu tutaj

Oto obraz widoku przedstawiający efekt spillover.

wprowadź opis obrazu tutaj

Oto ograniczenia IB, które dodałem.

wprowadź opis obrazu tutaj

smileBot
źródło
1

Nawet jeśli nie zmienia rozmiaru, inna sztuczka może pomóc w sytuacji, gdy UIPicker znajduje się na dole ekranu.

Można spróbować przesunąć go nieco w dół, ale środkowy rząd powinien pozostać widoczny. Pomoże to odsłonić trochę miejsca nad selektorem, ponieważ dolne rzędy będą poza ekranem.

Powtarzam, że nie jest to sposób na zmianę wysokości widoku UIPicker, ale pewne pojęcie, co można zrobić, jeśli wszystkie inne próby zawiodą.

Sergey Lost
źródło
1

Ok, po długich zmaganiach z głupim pickerviewem w iOS 4, postanowiłem zmienić sterowanie na prostą tabelkę: oto 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

Oto plik .h do tego:

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

to wszystko, teraz jedyne, co pozostało, to utworzenie zmiennej składowej w widoku combobox, która będzie przechowywać bieżący wybór wiersza, i dobrze jest iść.

Ciesz się wszystkim.

Alex
źródło
tutaj, co to jest VivatAwardsStruct, tutaj pojawia się błąd, VivatAwardsStruct niezadeklarowany
Mahesh Babu
1

Zasadniczo nie możesz tego zrobić w xib lub ustawić ramkę programowo, ale jeśli otworzysz jego nadrzędny xib jako źródło i zmienisz wysokość stamtąd, to działa.Kliknij prawym przyciskiem myszy xib, w którym znajduje się widok wyboru, Wyszukaj widok wyboru i możesz znaleźć wysokość, szerokość itp. w tym tagu Zmień wysokość, a następnie zapisz plik.

<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
źródło
0

O ile wiem, nie można zmniejszyć UIPickerView. Nie widziałem też nigdzie używanego krótszego. Domyślam się, że była to niestandardowa implementacja, jeśli udało im się ją zmniejszyć.

NilObject
źródło
Możesz zmienić rozmiar uipickerview w poziomie, ale jeśli ustawisz go zbyt krótko, spowoduje to wizualne usterki.
futureelite7
0

Jeśli chcesz utworzyć selektor w IB, możesz zmienić jego rozmiar ponownie na mniejszy. Sprawdź, czy nadal rysuje poprawnie, ponieważ przychodzi moment, w którym wygląda ohydnie.

Rob Winchester
źródło
0

Szybki : Musisz dodać widok podrzędny z klipem do granic

    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)

Powinno to spowodować dodanie obciętego selektora dat o wysokości 100 w górnej części kontrolera widoku.

Miika Pakarinen
źródło
0

Moja sztuczka: użyj warstwy maski DatePicker, aby dataPicker była widoczna. jak widzisz, po prostu zmień ramkę 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;
}
szczery
źródło
0

Używam warstwy maski, aby zmienić rozmiar wyświetlania

// 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
źródło
0

Osadź w widoku stosu. Widok stosu to składnik niedawno dodany przez firmę Apple w ich SDK systemu iOS w celu odzwierciedlenia implementacji opartych na siatce w bibliotekach interfejsu WWW opartych na skryptach java, takich jak bootstrap.

user5590043
źródło
0

Jak wspomniano powyżej, UIPickerViewmożna teraz zmieniać rozmiar. Chcę tylko dodać, że jeśli chcesz zmienić wysokość pickerView w komórce tableView, nie udało mi się ustawić kotwicy wysokości na stałą. Jednak użycie lessThanOrEqualToConstantwydaje się działać.

 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
źródło
-1

Po długim dniu drapania się w głowę znalazłem coś, co działa na mnie. Poniższe kody odtworzą UIDatePicker za każdym razem, gdy użytkownik zmieni orientację telefonu. Spowoduje to usunięcie wszelkich usterek, które ma UIDatePicker po zmianie orientacji.

Ponieważ odtwarzamy UIDatePicker, potrzebujemy zmiennej instancji, która zachowa wybraną wartość daty. Poniższe kody są testowane na 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
źródło
-1
stockPicker = [[UIPickerView alloc] init];
stockPicker.frame = CGRectMake(70.0,155, 180,100);

Jeśli chcesz ustawić rozmiar UiPickerView. Powyższy kod na pewno Ci się spodoba.

Deweloper
źródło
-1

W iOS 5.0 dostałem do pracy:

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

Stworzyło to selektor dat, taki jak ten, którego Apple używa w aplikacji Kalendarz podczas tworzenia nowego wydarzenia w trybie poziomym. (3 rzędy wysokości zamiast 5.) To nie zadziałało, gdy ustawiłem ramkę w ramach initWithFrame:metody, ale jak dotąd działa, gdy ustawiłem ją za pomocą oddzielnej metody.

Mark Leonard
źródło
-1

dla iOS 5:

jeśli wziąć szybki rzut oka na UIPickerView Protocol Reference

znajdziesz

 pickerView:rowHeightForComponent:
 pickerView:widthForComponent:

Myślę, że to pierwszy, którego szukasz

Daniel
źródło
pickerView:rowHeightForComponent:jest metodą delegata do decydowania o wysokości każdego wiersza, a nie o wysokości widoku selektora.
testowane