Настройка UIPickerView (фон и интервал) - PullRequest
6 голосов
/ 21 апреля 2011

Я хотел бы изменить белый фон в UIPickerView на собственное изображение.

Возможно ли это?

Кроме того, мне удалось заставить свой UIPickerView выполнять горизонтальную прокрутку вместо этоговертикали.Теперь я хотел бы знать, есть ли способ отрегулировать интервал между двумя рядами представления выбора?

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

Это мойкод:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    arrayDays = [[NSMutableArray alloc] init];
    [arrayDays addObject:@"ONSDAG"];
    [arrayDays addObject:@"TORSDAG"];
    [arrayDays addObject:@"FREDAG"];
    [arrayDays addObject:@"LØRDAG"];

    arrayDates = [[NSMutableArray alloc] init];
    [arrayDates addObject:@"29. JUNI"];
    [arrayDates addObject:@"30. JUNI"];
    [arrayDates addObject:@"1. JULI"];
    [arrayDates addObject:@"2. JULI"];

    pickerViewDay = [[UIPickerView alloc] initWithFrame:CGRectZero];
    [pickerViewDay setDelegate:self];
    [pickerViewDay setShowsSelectionIndicator:NO];
    CGAffineTransform rotate = CGAffineTransformMakeRotation(-M_PI/2);
    rotate = CGAffineTransformScale(rotate, 0.25, 2.0);
    [pickerViewDay setTransform:rotate];
    [pickerViewDay setCenter:CGPointMake(self.view.frame.size.width/2, (pickerViewDay.frame.size.height/2)-3)];
    [self.view addSubview:pickerViewDay];

    // Adding selection indicator to pickerview
    UIImage *selectorImage = [UIImage imageNamed:@"DayPickerView_SelectionIndicator.png"];
    UIView *customSelector = [[UIImageView alloc] initWithImage:selectorImage];
    [customSelector setFrame:CGRectMake(0, 0, 120, 74)];
    [customSelector setCenter:CGPointMake(self.view.frame.size.width/2, customSelector.frame.size.height/2)];
    [self.view addSubview:customSelector];
    [customSelector release];

    // Adding background to pickerview
    UIImage *backgroundImage = [UIImage imageNamed:@"DayPickerView_Background.png"];
    UIView *custombackground = [[UIImageView alloc] initWithImage:backgroundImage];
    [custombackground setFrame:CGRectMake(0, 0, 320, 74)];
    // [self.view addSubview:custombackground];
    [custombackground release];
}

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
    UIView *viewRow = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 150, 80)];

    CGAffineTransform rotate = CGAffineTransformMakeRotation(3.14/2);
    rotate = CGAffineTransformScale(rotate, 0.25, 2.0);

    // Date
    CGRect rectDate = CGRectMake(30, 0, 150, 80);
    UILabel *date = [[UILabel alloc]initWithFrame:rectDate];
    [date setTransform:rotate];
    [date setText:[arrayDates objectAtIndex:row]];
    [date setFont:[UIFont fontWithName:@"Arial-BoldMT" size:37.0]];
    [date setShadowColor:[UIColor whiteColor]];
    [date setShadowOffset:CGSizeMake(0, -1)];
    [date setTextAlignment:UITextAlignmentCenter];
    [date setBackgroundColor:[UIColor clearColor]];
    [date setClipsToBounds:YES];
    [viewRow addSubview:date];

    // Day
    CGRect rectDay = CGRectMake(-30, 0, 150, 80);
    UILabel *day = [[UILabel alloc]initWithFrame:rectDay];
    [day setTransform:rotate];
    [day setText:[arrayDays objectAtIndex:row]];
    [day setFont:[UIFont fontWithName:@"Arial-BoldMT" size:21.0]];
    [day setTextColor:[UIColor colorWithRed:0.35 green:0.35 blue:0.35 alpha:1]];
    [day setTextAlignment:UITextAlignmentCenter];
    [day setBackgroundColor:[UIColor clearColor]];
    [day setClipsToBounds:YES];
    [viewRow addSubview:day];

    return viewRow;
}

- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    return [arrayDays objectAtIndex:row];
}

- (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component {
    return [arrayDays count];
}

Example

РЕДАКТ. 1

Для RickiG (на фоне):

@RickiG: Backgrounds are messed up and there are gaps

РЕДАКТИРОВАТЬ 2

Для RickiG:

@RickiG: Gaps in each side of the pickerview

Ответы [ 4 ]

5 голосов
/ 21 апреля 2011

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

Есть ли особая причина, по которой вы реализуете оба вида viewForRow и TitleForRow? Обычно я просто заполняю метки viewForRow внутри этого метода делегата.

viewForRow имеет возможность многократного использования представлений в средстве выбора, во многом подобно UITableView, который вы должны проверить, если «reusingView: (UIView *) view» равен нулю, а если нет, то нет необходимости рисовать все заново. Просто заполните ярлыки.

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

Для интервала вы можете использовать «высоту» строк, средство выбора будет центрировать виды, которые вы возвращаете в viewForRow, а затем просто убедитесь:

- (CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component

возвращает значение, превышающее ваше представление.

Провел ог лыкке;)

4 голосов
/ 15 марта 2012

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

Просто определите категорию в файле, где вы хотите, чтобы вы выбирали, следующим образом:

@implementation UIPickerView(Extension)

-(void)drawRect:(CGRect)rect
{

    NSArray* subviews = [self subviews];
    for(UIView* view in subviews)
    {
        if([view isKindOfClass:[UITableView class]])
        {
            view.backgroundColor = appColor;
        }
    }
    [super drawRect:rect];
}

@end

Подробнее см. На subviews.

1 голос
/ 01 февраля 2014

Похоже, что это старый поток, но в iOS 7 (возможно, раньше, я не уверен), UIPickerViews имеют свойство цвета фона, поэтому установка цвета фона проста:

[pickerView setBackgroundColor:[UIColor whiteColor]];

Установка фонового изображения также проста благодаря [UIColor colorWithPatternImage:].(Обратите внимание, что шаблон будет мозаичным, если изображение меньше, чем UIPickerView.)

[pickerView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"someBackgroundImage.png"]]];

Чтобы изменить ширину компонента, вы можете реализовать метод делегата widthForComponent, чтобы установить различные ширины для каждого компонента.Теоретически вы должны иметь возможность добавить пустой компонент и использовать его пустую ширину для создания промежутка, но я не пробовал этого.

- (CGFloat)pickerView:(UIPickerView *)pickerView widthForComponent:(NSInteger)component;

Я не смог найти способ изменить отступ между компонентами, который кажется более приятным способом изменения расстояния, а также позволил бы удалить расстояние ~ 5 px между компонентами,но если я смогу найти его, я обновлю свой ответ.

0 голосов
/ 21 апреля 2011

Как насчет добавления пустого представления справа от ваших ярлыков?А для фона вам, вероятно, следует использовать метод insertSubview:aboveView: с фоновым представлением по умолчанию в качестве второго параметра (если вы можете получить к нему доступ).

...