Как изменить высоту UIPickerView - PullRequest
113 голосов
/ 22 февраля 2009

Можно ли изменить высоту UIPickerView? Некоторые приложения, кажется, имеют более короткие PickerViews, но установка меньшего фрейма не работает, и фрейм заблокирован в Интерфейсном Разработчике.

Ответы [ 28 ]

4 голосов
/ 22 февраля 2016

Это сильно изменилось в iOS 9 (в iOS 8 это очень похоже на то, что мы видим здесь). Если вы можете позволить себе ориентироваться только на iOS 9, тогда вы измените размер UIPickerView по своему усмотрению, установив его фрейм. Хорошо!

Вот из Примечания к выпуску iOS 9

Размеры UIPickerView и UIDatePicker теперь можно изменять адаптивный - ранее эти представления обеспечивали бы размер по умолчанию, даже если Вы пытались изменить их размер. Эти представления также теперь по умолчанию на ширину 320 точек на всех устройствах, а не на ширину устройства на iPhone.

Интерфейсы, которые полагаются на старое применение размера по умолчанию, будут скорее всего выглядит неправильно при компиляции под iOS 9. Возникли проблемы может быть решена путем полного ограничения или выбора размера представления выбора желаемый размер вместо того, чтобы полагаться на неявное поведение.

2 голосов
/ 28 сентября 2013

Я работаю с ios 7, Xcode 5. Мне удалось косвенно отрегулировать высоту выбора даты, заключив его в представление. Высота просмотра контейнеров может быть скорректирована.

1 голос
/ 18 сентября 2014

Обычно вы не можете сделать это в xib или установить фрейм программно, но если вы откроете его родительский 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>
1 голос
/ 18 августа 2010

Хорошо, после долгой борьбы с дурацким представлением выбора в 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];

вот и все, теперь осталось только создать переменную-член в представлении комбинированного списка, которая будет содержать текущий выбор строки, и мы готовы идти вперед.

Наслаждайтесь всеми.

1 голос
/ 20 августа 2010

Даже при том, что это не изменение размера, другой трюк может помочь в ситуации, когда UIPicker расположен в нижней части экрана.

Можно попытаться переместить его немного вниз, но центральный ряд должен оставаться видимым. Это поможет выявить некоторое пространство над сборщиком, так как нижние ряды будут за кадром.

Я повторяю, что это не способ изменения высоты представления UIPicker, а некоторая идея о том, что вы можете сделать, если все другие попытки потерпят неудачу.

1 голос
/ 01 апреля 2015

Создать представление в IB или коде. Добавьте свой подборщик как подпредставление этого представления. Измените вид. Это проще всего сделать в IB. Создайте ограничения от представления к его суперпредставлению и от средства выбора до этого нового представления.

Поскольку пикер изгибается вокруг него, он выплескивается сверху и снизу. Вы можете видеть в IB, когда вы добавляете верхние и нижние ограничения из средства выбора к представлению, оно показывает стандартное пространство, примерно 16 точек выше и ниже контейнера суперпредставления. Установите вид, чтобы обрезать его, если вы не хотите этого поведения (ужасное предупреждение).

Вот как это выглядит на 96 баллах на iPhone 5. Сборщик с вторичным эффектом составляет около 130 баллов. Довольно тощий!

Я использую это в своем проекте, чтобы предотвратить распространение сборщика на ненужную высоту. Эта техника урезает его и вызывает более плотный разлив. На самом деле это выглядит более компактно.

enter image description here

Вот изображение вида, показывающего побочный эффект.

enter image description here

Вот ограничения IB, которые я добавил.

enter image description here

0 голосов
/ 10 марта 2009

Смотрите мой ответ на этот вопрос: Размеры UIPicker в ландшафтном режиме

0 голосов
/ 10 сентября 2010

После долгого дня, почесав голову, я нашел что-то, что работает для меня. Приведенные ниже коды воссоздают 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
0 голосов
/ 09 сентября 2010
stockPicker = [[UIPickerView alloc] init];
stockPicker.frame = CGRectMake(70.0,155, 180,100);

Если вы хотите установить размер UiPickerView. Выше код, безусловно, будет работать для вас.

0 голосов
/ 28 марта 2018

Вставить в виде стека. Представление стека - это компонент, недавно добавленный Apple в свой iOS SDK, чтобы отразить реализации на основе сетки в библиотеках интерфейса пользователя java-скриптов, таких как bootstrap.

...