- 001
- 002
- 003
- 004
- 005
- 006
- 007
- 008
- 009
- 010
- 011
- 012
- 013
- 014
- 015
- 016
- 017
- 018
- 019
- 020
- 021
- 022
- 023
- 024
- 025
- 026
- 027
- 028
- 029
- 030
- 031
- 032
- 033
- 034
- 035
- 036
- 037
- 038
- 039
- 040
- 041
- 042
- 043
- 044
- 045
- 046
- 047
- 048
- 049
- 050
- 051
- 052
- 053
- 054
- 055
- 056
- 057
- 058
- 059
- 060
- 061
- 062
- 063
- 064
- 065
- 066
- 067
- 068
- 069
- 070
- 071
- 072
- 073
- 074
- 075
- 076
- 077
- 078
- 079
- 080
- 081
- 082
- 083
- 084
- 085
- 086
- 087
- 088
- 089
- 090
- 091
- 092
- 093
- 094
- 095
- 096
- 097
- 098
- 099
- 100
-(void) loadView
{
[super loadView];
// код, не относящийся к сути
picker = [[UIPickerView alloc] initWithFrame:CGRectZero];
picker.tag = 1;
picker.delegate = self;
picker.dataSource = self;
picker.transform = CGAffineTransformRotate(picker.transform, M_PI/2);
picker.frame = CGRectMake(20.0, -2.0, 280.0, 162.0);
picker.backgroundColor = [UIColor clearColor];
[picker selectRow:BPM inComponent:0 animated:NO];
[drumView addSubview:picker];
// стопиццот строк рисования в коде
}
-(NSInteger) numberOfComponentsInPickerView:(UIPickerView*) pickerView;
{
return 1;
}
-(NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger) component;
{
NSInteger res;
res = 221;
return res;
}
-(NSString*) pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger) component;
{
NSString *res;
res = @"";
return res;
}
-(CGFloat)pickerView:(UIPickerView *)pickerView rowHeightForComponent:(NSInteger)component
{
return 17.0;
}
-(UIView*) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView*)view
{
if (!wasCustomized)
[self customizePickerView:pickerView];
UIImageView *bg = [[UIImageView alloc] init];
bg.frame = CGRectMake(0, 0, 17, 39);
UIImage *img = [UIImage imageNamed:@"drum_cell.png"];
bg.image = img;
bg.transform = CGAffineTransformRotate(bg.transform, M_PI/2);
return [bg autorelease];
}
-(void) customizePickerView:(UIPickerView*)pickerView
{
[(UIView*)[pickerView.subviews objectAtIndex:0] setHidden:YES];
[(UIView*)[pickerView.subviews objectAtIndex:1] setHidden:YES];
[(UIView*)[pickerView.subviews objectAtIndex:3] setHidden:YES];
[(UIView*)[pickerView.subviews objectAtIndex:4] setHidden:YES];
BOOL isIt3 = NO;
for (UIView *v in pickerView.subviews)
if (v.tag == 3)
{
isIt3 = YES;
break;
}
if (!isIt3)
{
// меняем третью view
UIImageView *sh = [[UIImageView alloc] init];
sh.tag = 3;
sh.image = [UIImage imageNamed:@"drum_bg_on.png"];
sh.transform = CGAffineTransformRotate(sh.transform, M_PI/2);
sh.frame = CGRectMake(22, 19, 34, 242);
[pickerView addSubview:sh];
[sh release];
}
BOOL isIt2 = NO;
for (UIView *v in [(UIView*)[pickerView.subviews objectAtIndex:2] subviews])
if (v.tag == 2)
{
isIt2 = YES;
break;
}
if (!isIt2)
{
UIImageView *bg1 = [[UIImageView alloc] init];
bg1.tag = 2;
bg1.image = [UIImage imageNamed:@"drum_cell_big.png"];
bg1.transform = CGAffineTransformRotate(bg1.transform, -M_PI / 2);
bg1.frame = CGRectMake(0, -223, 48, 340);
[(UIView *) [pickerView.subviews objectAtIndex:2] addSubview:bg1];
[bg1 release];
for (int i = 0; i <= 11; i++)
{
[(UIView *) [pickerView.subviews objectAtIndex:2] addSubview:[self customIV:(116.0 + i * 340)]];
}
}
}
-(UIImageView *) customIV:(float) yPosition
{
UIImageView *bg = [[UIImageView alloc] init];
bg.image = [UIImage imageNamed:@"drum_cell_big.png"];
bg.transform = CGAffineTransformRotate(bg.transform, -M_PI / 2);
bg.frame = CGRectMake(0, yPosition, 48, 340);
return [bg autorelease];
}
Кастомизация UIPickerView для получения горизонтального "барабана", который при скроллинге "стучит".
Ученица умудрилась получить задание по масштабированию этого говна на Айпад. Убили вместе неделю на увеличение этого пикервью (оно, сволочь такая, отказывалось принимать нужные нам размеры, в своем setFrame: обрезая их до стандартных). Нагородили кучу костылей с трансформами, меня это в конце концов достало, и я за 5-6 часов накатал решение с использованием UIScrollView.
Пояснения.
1) drum_cell.png - это маленькая секция барабана. Этим рисунком заполняются 221 ячейки пикервью. Но вот беда - когда скроллим до краев, то ячейки заканчиваются и видим только голый, не разбитый визуально на секции бэкграунд.
2)Именно для решения этой проблемы был использован drum_cell_big.png. Он состоял примерно из 20 drum_cell.png, и он клался под генерируемые ячейки на скроллвью ([pickerView.subviews objectAtIndex:2]).
За скобками остался запуск побочного треда, из которого проставлялись значения на вьюхи.
Сейчас мучаюсь в текущем проект с ним. Уебански выглядит он.
UIPickerView - вот та горизонтльная хрень с плюсом и минусом.
Качество, правда, плохое.
Цифры - это кнопки. Вот не помню, сколько вариантов слева, но их там штуки 4. А справа - от 1 до 16.
С этой менюшкой забавный баг связан кстати. В цикле for была объявлена переменная
но не присвоена. И этот код работал, до смены версии компилятора, после чего стала отображаться пустая вьюха и прилетать креш при закрытии оной
Это так циклы в Обж-Си выглядят?
Или циклы выглядят так, что лучше не спрашивать?
Конкретно тут с циклом всё немного страшнее - надо либо сравнивать "!= 2" (но список индексов может измениться), либо использовать через множество. Множество из интегеров создаётся через зад.
Это как бы правильная реализация средствами фреймворка... но по-моему, это страшнее, чем было.
Можно сделать обычный массив
Но вся проблема в том, что сама идея изначального кода - безумна :)