UIPickerViewの高さを変更することは可能ですか?一部のアプリケーションはPickerViewが短いようですが、小さいフレームを設定しても機能しないようで、フレームはInterface Builderでロックされています。
UIPickerViewの高さを変更することは可能ですか?一部のアプリケーションはPickerViewが短いようですが、小さいフレームを設定しても機能しないようで、フレームはInterface Builderでロックされています。
回答:
Appleがのデフォルトの高さでマッキングを特に勧めていないことは明らかであるように見えUIPickerView
ますが、作成時に完全な制御を取り、希望のフレームサイズを渡すことで、ビューの高さを変更できることがわかりました。
smallerPicker = [[UIPickerView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 120.0)];
さまざまな高さと幅で、視覚的な不具合があることがわかります。明らかに、これらのグリッチは何らかの方法で回避する必要があるか、それらを示さない別のサイズを選択する必要があります。
上記のアプローチはどれもiOS 4.0では機能しません
pickerViewの高さはサイズ変更できなくなりました。4.0でピッカーのフレームを変更しようとすると、コンソールにダンプされるメッセージがあります。
-[UIPickerView setFrame:]: invalid height value 66.0 pinned to 162.0
OS 3.xxとOS 4.0の両方で機能する小さなピッカーの効果を得るために、私は結局かなり急進的なことをしました。私はピッカーをSDKが決定するサイズに設定し、代わりにピッカーが見えるようになる背景画像にカットスルー透明ウィンドウを作成しました。次に、ピッカーをバックグラウンドUIImageViewの後ろ(Zオーダー)に配置するだけで、ピッカーの一部のみが表示され、バックグラウンドの透明なウィンドウによって指示されます。
の有効な高さは3つだけですUIPickerView (162.0, 180.0 and 216.0)
。
CGAffineTransformMakeTranslation
およびCGAffineTransformMakeScale
関数を使用して、ピッカーを適切に適切に合わせることができます。
例:
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));
上記のコードは、ピッカービューの高さを半分に変更し、正確な(Left-x1、Top-y1)位置に再配置します。
iOS 4.2および4.3では、次のように動作します。
UIDatePicker *datePicker = [[UIDatePicker alloc] init];
datePicker.frame = CGRectMake(0, 0, 320, 180);
[self addSubview:datePicker];
以下は機能しません。
UIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, 320, 180)];
[self addSubview:datePicker];
アプリストアに3行の日付ピッカーを備えたアプリがあります。日付ピッカーの境界線の下にテキストが表示されるため、高さの変更が妨げられたのではないかと思いましたが、これは通常の高さ216の日付ピッカーでも発生します。
バグはどれですか?あなたの推測は私のものと同じです。
また、162.0、180.0、および216.0にはUIDatePicker
(およびUIPickerView
)3つの有効な高さがあります。UIPickerView
高さを他の値に設定すると、iOSデバイスでデバッグするときにコンソールに次のように表示されます。
2011-09-14 10:06:56.180 DebugHarness[1717:707] -[UIPickerView setFrame:]: invalid height value 300.0 pinned to 216.0
iOS 9以降、UIPickerView
の幅と高さを自由に変更できます。上記の変換ハックを使用する必要はありません。
私はあなたが UIPickerViewのサイズを編集できることを発見しました-ただインターフェースビルダーでではありません。テキストエディターで.xibファイルを開き、ピッカービューのサイズを任意に設定します。インターフェイスビルダーはサイズをリセットせず、機能しているようです。アップルが理由のためにサイズをロックしたと私は確信しているので、何が機能するかを確認するために異なるサイズで実験する必要があります。
UIPickerView
べき動作をするようにしますUIViewController
viewWillLayoutSubviews
し、UIPickerView
UIPopover
UIPickerView
pickerView viewForRow
して、サブビューの変換を元に戻す必要がありますUIPickerViewをサブクラス化し、次のコードを使用して2つのメソッドを上書きします。サブクラス化、固定高さ、変換アプローチを組み合わせています。
#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;
}
ピッカービューの表示高さを変更する簡単な方法は、ピッカーをUIViewに埋め込み、親ビューの高さをピッカーの表示したい高さに調整してから、親UIViewのインターフェイスビルダーで「サブビューのクリップ」を有効にすることです。またはview.clipsToBounds = true
コードで設定します。
Clip Subviews
。またの大きさは、UIPickerView
背が高くなければなりません-あなたは、あなたの中心を目指す必要がありUIPickerView
、親の内側見えるようにUIView
UIPickerView
コードから作成しませんでした)。
上記のアドバイスのいずれにも従うことができませんでした。
私は複数のチュートリアルを見て、これを見つけましたが最も有益である:
アプリで機能する「viewDidLoad」メソッド内に新しい高さを設定する次のコードを追加しました。
UIPickerView *picker = [[UIPickerView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 120.0)];
[self.view addSubview:picker];
picker.delegate = self;
picker.dataSource = self;
これがお役に立てば幸いです!
これはiOS 9で大幅に変更されました(iOS 8では、これは私たちがここで見ているものとかなり似ています)。iOS 9のみを対象とする余裕がある場合は、UIPickerView
、フレームを設定して、します。良い!
こちらはiOS 9リリースノートからです
UIPickerViewとUIDatePickerはサイズ変更と適応が可能になりました。以前は、これらのビューのサイズを変更しようとした場合でも、デフォルトのサイズが強制されていました。これらのビューも、iPhoneのデバイス幅ではなく、すべてのデバイスで320ポイントの幅にデフォルト設定されるようになりました。
iOS 9向けにコンパイルすると、古いサイズの強制に依存するインターフェースは正しく表示されない可能性があります。発生した問題は、暗黙の動作に依存する代わりに、ピッカービューを目的のサイズに完全に制約またはサイズ変更することで解決できます。
私はiOS 7、Xcode 5で作業しています。日付ピッカーをビューで囲むことにより、間接的に日付ピッカーの高さを調整できました。コンテナビューの高さを調整できます。
IBまたはコードでビューを作成します。このビューのサブビューとしてピッカーを追加します。ビューのサイズを変更します。これはIBで行うのが最も簡単です。ビューからそのスーパービューまで、およびピッカーからこの新しいビューまでの制約を作成します。
その周りのピッカーカーブがビューの上部と下部に溢れているため。ピッカーからビューに上下の制約を追加すると、IBでスーパービューコンテナーの上下16ポイントのような標準スペースが表示されます。この動作を望まない場合は、ビューをクリップするように設定してください(醜い警告)。
iPhone 5での高さが96ポイントの様子は次のとおりです。スピルオーバー付きのピッカーの高さは約130ポイントです。かなり細い!
プロジェクトでこれを使用して、ピッカーが不必要な高さまで広がるのを防ぎます。このテクニックはそれを削減し、より強い流出を強制します。実際には、少しコンパクトに見えるように見えます。
これは波及を示すビューの画像です。
これが私が追加したIB制約です。
わかりました、iOS 4の愚かなピッカービューで長い間苦労した後、私は自分のコントロールを単純なテーブルに変更することにしました。ここにコードがあります:
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
そのための.hファイルは次のとおりです。
//
// 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];
それだけです。今残っているのは、現在の行選択を保持するメンバー変数をコンボボックスビューに作成することだけです。これで準備は完了です。
みんなをお楽しみください。
通常、プログラムでxibまたはフレームの設定でそれを行うことはできませんが、親のxibをソースとして開き、そこから高さを変更すると、機能します。そのタグで、高さを変更してファイルを保存します。
<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>
私の知る限り、UIPickerViewを縮小することは不可能です。また、実際に使用されている短いものはどこにもありません。私が思うに、彼らがなんとかそれを縮小できたなら、それはカスタム実装だったと思います。
IBでピッカーを作成する場合は、後のサイズ変更で小さいサイズにすることができます。それが凶暴に見える点があるので、それでもそれがまだ正しく描画されていることを確認してください。
Swift:クリップ付きのサブビューを境界に追加する必要があります
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)
これにより、ビューコントローラの上部に高さ100の日付のピッカーがクリップされます。
私のトリック:datePickerのマスクレイヤーを使用して、datePickerの一部を表示します。ご覧のように、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;
}
スタックビューに埋め込みます。スタックビューは、最近AppleがiOS SDKに追加したコンポーネントであり、ブートストラップなどのJavaスクリプトWebベースのフロントエンドライブラリのグリッドベースの実装を反映しています。
上記のとおり、UIPickerView
サイズ変更が可能になりました。ただし、tableViewセルでpickerViewの高さを変更する場合、高さアンカーを定数に設定することはできませんでした。ただし、使用lessThanOrEqualToConstant
は機能するようです。
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)
}
}
頭を悩ませる長い一日を過ごした後、自分にぴったりのものが見つかりました。以下のコードは、ユーザーが電話の向きを変更するたびにUIDatePickerを再作成します。これにより、方向を変更した後にUIDatePickerにあるグリッチがすべて削除されます。
UIDatePickerを再作成しているため、選択した日付値を保持するインスタンス変数が必要です。以下のコードは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
iOS 5の場合:
UIPickerView Protocol Referenceをざっと見てみると
あなたは見つけるでしょう
– pickerView:rowHeightForComponent:
– pickerView:widthForComponent:
あなたが探している最初のものだと思います
pickerView:rowHeightForComponent:
ピッカービューの高さではなく、各行の高さを決定するデリゲートメソッドです。