Размер UIPicker в ландшафтном режиме

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


person Community    schedule 11.02.2009    source источник


Ответы (7)


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

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

}

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

person Community    schedule 14.09.2009

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

person user170360    schedule 08.09.2009

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

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

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

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

person Can Berk Güder    schedule 11.02.2009

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

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

Удачи

person Kia    schedule 30.06.2010

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

person JamesSugrue    schedule 11.02.2009

Ответ в:

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

Поскольку с:

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

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

person CocoaChris    schedule 02.01.2010

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

person cdasher    schedule 23.12.2009