Определение размера UIPicker в ландшафтном режиме - PullRequest
9 голосов
/ 11 февраля 2009

Я пытаюсь разработать приложение с UIPicker в ландшафтном режиме, занимая (почти) всю ширину экрана (с 5 или 6 компонентами). Подскажите, пожалуйста, как установить размер UIPicker. Большое спасибо за Вашу помощь.

Ответы [ 7 ]

9 голосов
/ 14 сентября 2009

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

в viewDidLoad .....

picker = [[UIPickerView alloc] initWithFrame:CGRectZero];
picker.delegate = self;
picker.dataSource = self;
picker.showsSelectionIndicator = NO;


//Resize the picker, rotate it so that it is horizontal and set its position
CGAffineTransform rotate = CGAffineTransformMakeRotation(-1.57);  
rotate = CGAffineTransformScale(rotate, .46, 2.25);
CGAffineTransform t0 = CGAffineTransformMakeTranslation(3, 22.5);
picker.transform = CGAffineTransformConcat(rotate,t0);
[self.view addSubview:picker];
[picker release];

Затем я хотел бы добавить фоновое изображение для моего вида, которое закрывает серые полосы (которые теперь сверху и снизу) UIPicker:

//Create the overlay to superimpose ontop of the picker
//In this case, the image is the size of the screen with a transparent area the size of the //UIPickerView cut out in the middle

UIImageView *uiiv = [[UIImageView alloc] 
                     initWithImage:[UIImage                                 imageNamed:@"problem_bg.png"]];
uiiv.userInteractionEnabled = NO;
uiiv.opaque = YES; //for performance
[self.view addSubview:uiiv];
[uiiv release];

Метод делегата UIPickerView:

-(UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)rowforComponent:(NSInteger)component reusingView:(UIView *)view
 {

    UIView *viewForRow = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 280)] autorelease];
    UIImageView *img = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myimage.png"]];

    img.frame = CGRectMake(0, 0, 102,280);
    img.opaque = YES;
    [viewForRow addSubview:img];
    [img release];
    UILabel *label;

    UIFont *font = [ UIFont fontWithName:@"Helvetica"  size:20];

    label = [[[UILabel alloc] initWithFrame:CGRectMake(10, 20, 270, 100)] autorelease];

    label.text = @"I am a label";
    label.textAlignment = UITextAlignmentCenter;
    label.textColor = [UIColor blackColor];
    label.font = font;
    label.backgroundColor = [UIColor clearColor];
    label.opaque = NO;
        [viewForRow addSubview:label];

    CGAffineTransform rotate = CGAffineTransformMakeRotation(1.57);  
        [viewForRow setTransform:rotate]; 
    return viewForRow;

}

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

4 голосов
/ 08 сентября 2009

Вы можете редактировать размер, открыв файл .xib в TextEdit и изменив размер UIPickerView.

4 голосов
/ 11 февраля 2009

Вы не можете. Размер UIPickerView постоянен.

ОБНОВЛЕНИЕ: Оказывается, вы можете изменить размер UIPickerView. Хитрость заключается в том, чтобы поместить его в другой (меньший) UIView и изменить его размер. Я еще не пробовал это.

ОБНОВЛЕНИЕ 2: Этот метод не изменяет размер UIPickerView, а скорее обрезает его. Это может или не может быть то, что вы ищете, но AFAIK, нет никакого способа действительно изменить размер UIPickerView, и это настолько близко, насколько это возможно. Это не выглядит , что плохо.

ОБНОВЛЕНИЕ 3 (давно просрочено): Начиная с SDK 3.0, UIPickerView полностью изменяет размер с помощью initWithFrame или setFrame.

1 голос
/ 01 июля 2010

Я боролся с той же проблемой изменения размера окна выбора. После некоторых исследований и головной боли вот что вы можете легко сделать:

  1. Забудь о построителе интерфейсов! Я думаю, что вы можете гораздо лучше без построитель интерфейса.
  2. В ваших контроллерах перезаписать метод просмотра нагрузки.

    -(void)loadView
    {
            //create your view
     self.view = [[UIView alloc] initWithFrame:CGRectZero];
     // create a default sized pickerView
     pickerView = [[UIPickerView alloc] initWithFrame:CGRectZero];
     pickerView.delegate = self;
     pickerView.dataSource = self;
     pickerView.showsSelectionIndicator = YES;
    
      // Get its frame
     CGRect pickerFrame = pickerView.frame;
    
       // Set it to what ever you like, I use a default screen height times a shrink factor like 0.75 for 3/4 of its original size
     pickerFrame.size.width = screenWidth*pickerShrinkFactor;
     pickerFrame.size.height =  pickerHeight*pickerShrinkFactor;
     // You can also set the upper left corner of the picker
     pickerFrame.origin.x = 0;
     // Set the picker frame to new size and origin
            pickerView.frame = pickerFrame;
            // Add it to your view
     [self.view addSubview:pickerView];
    
    }
    

Удачи

0 голосов
/ 02 января 2010

Ответ:

-(UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {

Так как с:

- (NSString*)pickerView:(UIPickerView*)pv titleForRow:(NSInteger)row forComponent:(NSInteger)component

Заставляет это работать (то есть: сбоку с масштабированной этикеткой), конечно

0 голосов
/ 23 декабря 2009

Нет проблем (я только что зарегистрировался). Кстати, я только что понял, что, когда я отправил свой ответ, метод (UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent .... потерял пространство между строкой и forComponent. Поэтому убедитесь, что у вас есть правильный делегат, иначе он не будет работать.

0 голосов
/ 11 февраля 2009

Я вполне уверен, что UIPicker имеет один размер, который вы не можете изменить. Было бы интересно услышать разные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...