Czy można zmienić wysokość UIPickerView? Niektóre aplikacje wydają się mieć krótsze PickerViews, ale ustawienie mniejszej ramki nie działa, a ramka jest zablokowana w Interface Builder.
Czy można zmienić wysokość UIPickerView? Niektóre aplikacje wydają się mieć krótsze PickerViews, ale ustawienie mniejszej ramki nie działa, a ramka jest zablokowana w Interface Builder.
Odpowiedzi:
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.
Ż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.
Istnieją tylko trzy ważne wysokości UIPickerView (162.0, 180.0 and 216.0)
.
Możesz użyć funkcji CGAffineTransformMakeTranslation
i, CGAffineTransformMakeScale
aby 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) .
Próbować:
pickerview.transform = CGAffineTransformMakeScale(.5, 0.5);
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 UIPickerView
wysokość 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
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.
UIPickerView
zachowuje się tak, jak powinnoUIViewController
viewWillLayoutSubviews
aby przeskalować / ustawićUIPickerView
UIPopover
UIPickerView
pickerView viewForRow
aby cofnąć transformację dla podwidokówPodklasa 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;
}
Ł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 = true
w kodzie.
Clip Subviews
. również rozmiar UIPickerView
musi być wyższy - i musisz wycelować w środek swojego, UIPickerView
aby był widoczny wewnątrz rodzicaUIView
UIPickerView
z kodu).
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!
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 UIPickerView
wedł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.
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ć.
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ą.
Oto obraz widoku przedstawiający efekt spillover.
Oto ograniczenia IB, które dodałem.
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ą.
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.
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>
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ć.
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.
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.
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;
}
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.
Jak wspomniano powyżej, UIPickerView
moż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 lessThanOrEqualToConstant
wydaje 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)
}
}
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
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.
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
pickerView:rowHeightForComponent:
jest metodą delegata do decydowania o wysokości każdego wiersza, a nie o wysokości widoku selektora.