Cách thay đổi chiều cao UIPickerView


116

Có thể thay đổi chiều cao của UIPickerView không? Một số ứng dụng dường như có PickerView ngắn hơn nhưng việc đặt khung nhỏ hơn dường như không hoạt động và khung bị khóa trong Trình tạo giao diện.


1
Câu trả lời bổ sung có thể được tìm thấy trong một câu hỏi tương tự: làm thế nào để thu nhỏ chế độ xem bộ chọn trong iPhone? .
Brad Larson

Câu trả lời:


54

Có vẻ như Apple không đặc biệt mời tạo mucking với chiều cao mặc định của UIPickerView, nhưng tôi nhận thấy rằng bạn có thể đạt được sự thay đổi về chiều cao của chế độ xem bằng cách kiểm soát hoàn toàn và chuyển kích thước khung hình mong muốn tại thời điểm tạo, ví dụ:

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

Bạn sẽ phát hiện ra rằng ở các chiều cao và chiều rộng khác nhau, có những trục trặc về hình ảnh. Rõ ràng, những trục trặc này sẽ cần được khắc phục bằng cách nào đó, hoặc chọn một kích thước khác không thể hiện chúng.


2
Điều này làm việc cho bạn? Tất cả UIPickerViews tôi nhanh chóng dường như bị khoá lên một tầm cao của 215 ...
Andy Bourassa

Nó làm việc cho tôi. Bạn có đang chỉ định chiều cao rút gọn trong phương thức initWithFrame, như tôi đã mô tả không? Họ có xu hướng chiến đấu để duy trì một chiều cao nhất định, nhưng một khi tôi khởi tạo với một khung hình ngắn, nó đã hoạt động. Nếu bạn vẫn không thể làm cho nó hoạt động, tôi sẽ xem nếu tôi có thể trích dẫn một mẫu.
danielpunkass

Có bất kỳ sự kiểm soát nào của bên thứ ba cho phép thay đổi kích thước không?
cfischer

1
Điều này đã hiệu quả. 4.3. Tôi bắt đầu với khung và setframe trước khi xuất hiện lần đầu.
griotspeak

2
Tôi đã bị mắc kẹt về điều này trong một thời gian. Điều QUAN TRỌNG cần lưu ý là bạn PHẢI bắt kịp khung hình hoặc khung thiết lập trước khi xuất hiện lần đầu nếu không bạn sẽ bị trục trặc hình ảnh.
w.donahue 13/10/11

46

Không có phương pháp nào ở trên hoạt động trong iOS 4.0

Chiều cao của PickerView không còn có thể thay đổi kích thước được nữa. Có một thông báo được đưa vào bảng điều khiển nếu bạn cố gắng thay đổi khung của bộ chọn trong 4.0:

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

Cuối cùng tôi đã làm một việc khá triệt để để có được hiệu ứng của một bộ chọn nhỏ hơn hoạt động trong cả OS 3.xx và OS 4.0. Tôi để bộ chọn ở bất kỳ kích thước nào mà SDK quyết định nó sẽ như vậy và thay vào đó, tạo một cửa sổ trong suốt cắt ngang trên hình nền của tôi mà qua đó bộ chọn sẽ hiển thị. Sau đó, chỉ cần đặt bộ chọn phía sau (Thứ tự Z khôn ngoan) UIImageView nền của tôi để chỉ một phần của bộ chọn được hiển thị được quy định bởi cửa sổ trong suốt trong nền của tôi.


44

Chỉ có ba chiều cao hợp lệ cho UIPickerView (162.0, 180.0 and 216.0).

Bạn có thể sử dụng các chức năng CGAffineTransformMakeTranslationCGAffineTransformMakeScalechức năng để phù hợp với bộ chọn sao cho thuận tiện.

Thí dụ:

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

Đoạn mã trên thay đổi chiều cao của chế độ xem bộ chọn thành một nửa và định vị lại nó về vị trí chính xác (Left-x1, Top-y1) .


1
Câu trả lời chính xác. Chỉ cần lưu ý rằng để thay đổi chiều cao của bộ chọn, bạn không cần sử dụng bản dịch: pickerview.transform = CGAffineTransformMakeScale (1,0, 0,5);
Borzh

2
Cảm ơn. Có vẻ đúng nhưng có tài liệu nào của Apple về độ cao hợp lệ không?
Eric Chen

40

Thử:

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

2
Tôi biết tôi đến muộn bữa tiệc ở đây - và có lẽ hiện tại có nhiều phương pháp tốt hơn để làm điều này, nhưng điều này đã hiệu quả với tôi.
Hanny

Hoạt động tuyệt vời! Đối với Swift (iOS 10), đó là: statePicker.transform = CGAffineTransform (scaleX: 0.8, y: 0.8)
Meshach

25

Trong iOS 4.2 & 4.3, các hoạt động sau:

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

Cách sau không hoạt động:

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

Tôi có một ứng dụng trong cửa hàng ứng dụng với bộ chọn ngày 3 dòng. Tôi nghĩ rằng thay đổi độ cao có thể đã bị ngăn chặn vì bạn nhìn thấy văn bản dưới đường viền của bộ chọn ngày, nhưng điều này cũng xảy ra với bộ chọn ngày 216 độ cao bình thường.

Đó là lỗi nào? Dự đoán của bạn cũng tốt như của tôi.

Ngoài ra, có 3 chiều cao hợp lệ cho UIDatePicker(và UIPickerView) 162.0, 180.0 và 216.0. Nếu bạn đặt UIPickerViewchiều cao thành bất kỳ thứ gì khác, bạn sẽ thấy thông tin sau trong bảng điều khiển khi gỡ lỗi trên thiết bị iOS.

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

14

Kể từ iOS 9, bạn có thể tự do thay đổi UIPickerViewchiều rộng và chiều cao. Không cần sử dụng các bản hack chuyển đổi đã đề cập ở trên.


cần xác định cách thêm inputAccessoryView vào UIPickerView có kích thước tăng lên.
DogCoffee

Tâm sự chia sẻ như thế nào?
inmanl

10

Tôi nhận thấy rằng bạn có thể chỉnh sửa kích thước của UIPickerView - không chỉ với trình tạo giao diện. mở tệp .xib bằng trình soạn thảo văn bản và đặt kích thước của chế độ xem bộ chọn thành bất kỳ thứ gì bạn muốn. Trình tạo giao diện không đặt lại kích thước và nó có vẻ hoạt động. Tôi chắc rằng apple đã khóa kích thước là có lý do, vì vậy bạn sẽ phải thử nghiệm với các kích thước khác nhau để xem loại nào hoạt động.


7

Ưu điểm:

  1. Làm cho setFrame UIPickerViewhoạt động như nó nên
  2. Không có mã chuyển đổi trong UIViewController
  3. Hoạt động bên trong viewWillLayoutSubviewsđể bán lại / định vịUIPickerView
  4. Hoạt động trên iPad mà không cần UIPopover
  5. Lớp cha luôn nhận được chiều cao hợp lệ
  6. Hoạt động với iOS 5

Nhược điểm:

  1. Yêu cầu bạn phân lớp UIPickerView
  2. Yêu cầu sử dụng pickerView viewForRowđể hoàn tác chuyển đổi cho các Chế độ xem phụ
  3. UIAnimations có thể không hoạt động

Giải pháp:

Subclass UIPickerView và ghi đè hai phương thức bằng đoạn mã sau. Nó kết hợp phân lớp con, chiều cao cố định và phương pháp chuyển đổi.

#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

Một cách dễ dàng để thay đổi chiều cao có thể nhìn thấy của chế độ xem bộ chọn là nhúng bộ chọn vào UIView, điều chỉnh chiều cao của chế độ xem gốc thành độ cao bạn muốn xem của bộ chọn, sau đó bật "Clip Subviews" trong Trình tạo giao diện trên UIView chính hoặc đặt view.clipsToBounds = truetrong mã.

Clip Subviews trong IB


bạn có thể xác nhận rằng điều này thực sự hoạt động? Trên xcode có vẻ như nó nhưng chạy trên thiết bị nó cho thấy pickerview qua UIView rằng
nhenrique

1
Nó hoạt động @nhenrique, nhưng bạn không được quên Clip Subviews. cũng là kích thước của UIPickerViewphải cao hơn - và bạn phải đặt mục tiêu trung tâm của bạn UIPickerViewđược hiển thị bên trong phụ huynhUIView
new2ios

Ý tưởng hay, đây là giải pháp cho tôi trong iOS 7.1.
Douglas Nassif Roma Junior

Tính năng này không hoạt động, @ new2ios, bạn có thể xác nhận rằng tính năng này đang hoạt động trong iOS8> không? Tôi đang cố gắng làm điều tương tự theo chương trình.
Hemang

Xin lỗi, @hagile, nhưng tôi từ bỏ ý định đó - tôi không thể xác nhận. Tôi sử dụng Storyboard (không tạo UIPickerViewtừ mã).
new2ios

5

Tôi đã không thể làm theo bất kỳ lời khuyên nào ở trên.

Tôi đã xem nhiều hướng dẫn và thấy bài này có lợi nhất:

Tôi đã thêm mã sau để đặt chiều cao mới bên trong phương thức "viewDidLoad", phương thức này hoạt động trong ứng dụng của tôi.

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

Hy vọng điều này là hữu ích!


4

Điều này đã thay đổi rất nhiều trong iOS 9 (trong iOS 8, nó khá giống với những gì chúng ta đang thấy ở đây). Nếu bạn có đủ khả năng chỉ nhắm mục tiêu iOS 9, thì bạn thay đổi kích thướcUIPickerView khi bạn thấy phù hợp, bằng cách thiết lập khung của nó. Tốt!

Đây là từ Ghi chú phát hành iOS 9

UIPickerView và UIDatePicker hiện có thể thay đổi kích thước và thích ứng — trước đây, các chế độ xem này sẽ thực thi kích thước mặc định ngay cả khi bạn đã cố gắng thay đổi kích thước chúng. Các chế độ xem này giờ đây cũng được mặc định là chiều rộng 320 điểm trên tất cả các thiết bị, thay vì chiều rộng thiết bị trên iPhone.

Các giao diện dựa trên việc thực thi cũ về kích thước mặc định có thể sẽ trông sai khi được biên dịch cho iOS 9. Mọi vấn đề gặp phải đều có thể được giải quyết bằng cách hạn chế hoàn toàn hoặc sắp xếp các chế độ xem bộ chọn theo kích thước mong muốn thay vì dựa vào hành vi ngầm định.


2

Tôi đang làm việc với ios 7, Xcode 5. Tôi đã có thể điều chỉnh độ cao của bộ chọn ngày gián tiếp bằng cách đặt nó trong một khung nhìn. Có thể điều chỉnh chiều cao khung nhìn vùng chứa.


Điều này hoạt động miễn là tôi chạy nó trên iOS 7. Khi tôi chạy cùng một bản dựng này trên iOS 6, toàn bộ bộ chọn sẽ hiển thị mong đợi cho các phần bị ghi đè bởi các chế độ xem khác. Miễn là bạn chỉ nhắm mục tiêu> = 7 thì điều này có thể khả thi. Thứ tự các chế độ xem sao cho bộ chọn được hiển thị trước tiên sẽ ẩn một cách hiệu quả các phần bên ngoài nhưng điều này chỉ che nó với các chế độ xem khác.
Doug Gerecht

Bạn có thể giải thích thêm một chút về cách điều này được thực hiện không? Điều này chỉ để thu nhỏ chế độ xem hay bạn cũng có thể làm cho bộ chọn lớn hơn? Hiện đang phát triển một ứng dụng iOS 7 cho iPad và tôi cần người chọn để cao hơn, nhưng dù cố gắng thế nào, tôi vẫn không thể làm cho nó lớn hơn!
Lizza 12/1213

2

Tạo chế độ xem trong IB hoặc mã. Thêm bộ chọn của bạn làm chế độ xem phụ của chế độ xem này. Thay đổi kích thước chế độ xem. Điều này dễ thực hiện nhất trong IB. Tạo ràng buộc từ chế độ xem đến chế độ xem siêu cao của nó và từ bộ chọn đến chế độ xem mới này.

Vì Bộ chọn uốn cong xung quanh nó tràn ra trên cùng và dưới cùng của chế độ xem. Bạn có thể thấy trong IB khi bạn thêm các ràng buộc trên và dưới từ bộ chọn vào chế độ xem, nó sẽ hiển thị một không gian tiêu chuẩn giống như 16 điểm ở trên và dưới vùng chứa superview. Đặt chế độ xem thành clip nếu bạn không muốn hành vi này (cảnh báo xấu xí).

Đây là những gì nó trông như thế nào ở độ cao 96 điểm trên iPhone 5. Bộ chọn với điểm tràn cao khoảng 130 điểm. Khá gầy!

Tôi đang sử dụng điều này trong dự án của mình để ngăn bộ chọn lan ra đến độ cao không cần thiết. Kỹ thuật này cắt nhỏ nó xuống và ép tràn chặt hơn. Nó thực sự trông bóng bẩy và nhỏ gọn hơn một chút.

nhập mô tả hình ảnh ở đây

Đây là hình ảnh của chế độ xem cho thấy sự lan tỏa.

nhập mô tả hình ảnh ở đây

Đây là các ràng buộc IB mà tôi đã thêm.

nhập mô tả hình ảnh ở đây


1

Ngay cả khi nghĩ rằng nó không phải là thay đổi kích thước, một thủ thuật khác có thể hữu ích trong tình huống UIPicker nằm ở cuối màn hình.

Người ta có thể thử di chuyển nó xuống một chút, nhưng hàng trung tâm sẽ vẫn hiển thị. Điều này sẽ giúp tiết lộ một số khoảng trống phía trên bộ chọn vì các hàng dưới cùng sẽ nằm ngoài màn hình.

Tôi nhắc lại rằng đây không phải là cách thay đổi chiều cao của chế độ xem UIPicker mà là một số ý tưởng về những gì bạn có thể làm nếu tất cả các nỗ lực khác không thành công.


1

Được rồi, sau một thời gian dài vật lộn với chế độ xem ngu ngốc trong iOS 4, tôi đã quyết định thay đổi điều khiển của mình thành bảng đơn giản: đây là mã:

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

Đây là tệp .h cho điều đó:

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

thế là xong, bây giờ việc duy nhất còn lại là tạo một biến thành viên trong dạng xem hộp kết hợp sẽ giữ lựa chọn hàng hiện tại và chúng ta đã sẵn sàng.

Chúc mọi người vui vẻ.


đây là những gì VivatAwardsStruct, tôi đang nhận lỗi ở đây, VivatAwardsStruct không khai báo
Mahesh Babu

1

Nói chung, bạn không thể làm điều đó trong xib hoặc khung thiết lập theo chương trình nhưng nếu bạn mở xib gốc của nó làm nguồn và thay đổi chiều cao từ đó thì nó sẽ hoạt động. Nhấp chuột phải vào xib trong đó chứa bộ chọn, Chế độ xem tìm kiếm và bạn có thể tìm thấy chiều cao, chiều rộng, v.v. trong thẻ đó, Thay đổi chiều cao ở đó rồi lưu tệp.

<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

Theo như tôi biết, không thể thu nhỏ UIPickerView. Tôi cũng chưa thực sự thấy một cái ngắn hơn được sử dụng ở bất cứ đâu. Tôi đoán rằng đó là một triển khai tùy chỉnh nếu họ cố gắng thu nhỏ nó.


Bạn có thể thay đổi kích thước uipickerview theo chiều ngang, nhưng nếu bạn đặt nó quá ngắn, nó sẽ gây rối mắt.
futureelite7

0

Nếu bạn muốn tạo bộ chọn của mình trong IB, bạn có thể thay đổi kích thước sau đó thành kích thước nhỏ hơn. Hãy kiểm tra để đảm bảo rằng nó vẫn vẽ chính xác, vì có một số điểm khiến nó trông rất tệ.


0

Swift : Bạn cần thêm một lượt xem phụ có clip vào giới hạn

    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)

Thao tác này sẽ thêm bộ chọn ngày độ cao 100 được cắt bớt ở đầu bộ điều khiển chế độ xem.


0

Mẹo của tôi: sử dụng lớp mặt nạ của datepicker để làm cho datePicker hiển thị một số phần. như bạn thấy giống như thay đổi khung của datepicke.

- (void)timeSelect:(UIButton *)timeButton {
UIDatePicker *timePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 550)];
timePicker.backgroundColor = [UIColor whiteColor];
timePicker.layer.mask = [self maskLayerWithDatePicker:timePicker];
timePicker.layer.masksToBounds = YES;
timePicker.datePickerMode = UIDatePickerModeTime;
[self.view addSubview:timePicker];
}

- (CALayer *)maskLayerWithDatePicker:(UIDatePicker *)datePicker {
CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] init];
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, datePicker.width*0.8, datePicker.height*0.8) cornerRadius:10];
shapeLayer.path = path.CGPath;
return shapeLayer;
}

0

Tôi sử dụng một lớp mặt nạ để thay đổi kích thước hiển thị của nó

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

Nhúng vào chế độ xem ngăn xếp. Chế độ xem ngăn xếp là một thành phần được Apple bổ sung gần đây trong SDK iOS của họ để phản ánh việc triển khai dựa trên lưới trong các thư viện giao diện người dùng web dựa trên java script như bootstrap.


0

Như đã đề cập ở trên UIPickerViewbây giờ có thể thay đổi kích thước. Tôi chỉ muốn nói thêm rằng nếu bạn muốn thay đổi chiều cao của pickerView trong ô tableView, tôi đã không thành công với việc đặt neo chiều cao thành một hằng số. Tuy nhiên, sử dụng lessThanOrEqualToConstantcó vẻ hiệu quả.

 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

Sau một ngày dài vò đầu bứt tai, tôi đã tìm thấy thứ phù hợp với mình. Các mã bên dưới sẽ tạo lại UIDatePicker mỗi khi người dùng thay đổi hướng điện thoại. Điều này sẽ loại bỏ bất kỳ trục trặc nào mà UIDatePicker gặp phải sau khi thay đổi hướng.

Vì chúng tôi đang tạo lại UIDatePicker, chúng tôi cần một biến cá thể sẽ giữ giá trị ngày đã chọn. Các mã dưới đây được thử nghiệm trên iOS 4.0.

    @interface AdvanceDateViewController : UIViewController<UIPickerViewDelegate> {
        UIDatePicker *datePicker;
        NSDate *date;
    }


    @property (nonatomic, retain) UIDatePicker *datePicker;
    @property (nonatomic, retain) NSDate *date;

    -(void)resizeViewWithOrientation:(UIInterfaceOrientation) orientation;

    @end

    @implementation AdvanceDateViewController
    @synthesize datePicker, date;

    - (void)viewDidLoad {
      [super viewDidLoad];
          [self resizeViewWithOrientation:self.interfaceOrientation];
    }


    -(void)viewWillAppear:(BOOL)animated{
         [super viewWillAppear:animated];
         [self resizeViewWithOrientation:self.interfaceOrientation];
     }

     - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
         return YES;
     }

     -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
      [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
      [self resizeViewWithOrientation:toInterfaceOrientation];
      }

     -(void)resizeViewWithOrientation:(UIInterfaceOrientation) orientation{
          [self.datePicker removeFromSuperview];
          [self.datePicker removeTarget:self action:@selector(refreshPickupDate) forControlEvents:UIControlEventValueChanged];
          self.datePicker = nil;

          //(Re)initialize the datepicker, thanks to Apple's buggy UIDatePicker implementation
          UIDatePicker *dummyDatePicker = [[UIDatePicker alloc] init];
          self.datePicker = dummyDatePicker;
          [dummyDatePicker release];

          [self.datePicker setDate:self.date animated:YES];
          [self.datePicker addTarget:self action:@selector(refreshPickupDate) forControlEvents:UIControlEventValueChanged];

          if(UIInterfaceOrientationIsLandscape(orientation)){
                 self.datePicker.frame = CGRectMake(0, 118, 480, 162);    
           } else {
                 self.datePicker.frame = CGRectMake(0, 200, 320, 216);
           }

           [self.view addSubview:self.datePicker];
           [self.view setNeedsDisplay];
      }

      @end

-1
stockPicker = [[UIPickerView alloc] init];
stockPicker.frame = CGRectMake(70.0,155, 180,100);

Nếu bạn muốn đặt kích thước của UiPickerView. Mã trên chắc chắn sẽ làm việc cho bạn.


-1

Trong iOS 5.0, tôi có những thứ sau để hoạt động:

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

Điều này đã tạo ra một công cụ chọn ngày giống như công cụ Apple sử dụng trong ứng dụng Lịch khi tạo sự kiện mới ở chế độ ngang. (Cao 3 hàng thay vì 5.) Điều này không hoạt động khi tôi đặt khung trong initWithFrame:phương pháp, nhưng cho đến nay hoạt động khi đặt nó bằng một phương pháp riêng biệt.


-1

cho iOS 5:

nếu bạn xem nhanh Giao thức UIPickerView Tham chiếu

bạn sẽ tìm thấy

 pickerView:rowHeightForComponent:
 pickerView:widthForComponent:

Tôi nghĩ là người đầu tiên bạn đang tìm kiếm


pickerView:rowHeightForComponent:là phương pháp ủy quyền để quyết định chiều cao của mỗi hàng - không phải chiều cao của chế độ xem bộ chọn.
turingtested
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.