- 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]).
За скобками остался запуск побочного треда, из которого проставлялись значения на вьюхи.
krypt 23.11.2012 17:49 # 0
QuickNick 23.11.2012 17:57 # 0
anonimb84a2f6fd141 23.11.2012 23:23 # 0
Xtasy 23.11.2012 18:49 # 0
Сейчас мучаюсь в текущем проект с ним. Уебански выглядит он.
krypt 23.11.2012 22:46 # 0
QuickNick 24.11.2012 16:33 # 0
krypt 24.11.2012 16:56 # 0
QuickNick 24.11.2012 16:34 # 0
krypt 24.11.2012 16:59 # 0
UIPickerView - вот та горизонтльная хрень с плюсом и минусом.
Качество, правда, плохое.
Fai 24.11.2012 19:59 # 0
krypt 24.11.2012 20:20 # 0
Цифры - это кнопки. Вот не помню, сколько вариантов слева, но их там штуки 4. А справа - от 1 до 16.
С этой менюшкой забавный баг связан кстати. В цикле for была объявлена переменная
но не присвоена. И этот код работал, до смены версии компилятора, после чего стала отображаться пустая вьюха и прилетать креш при закрытии оной
Xtasy 26.11.2012 13:05 # 0
wvxvw 25.11.2012 20:49 # +2
Это так циклы в Обж-Си выглядят?
Или циклы выглядят так, что лучше не спрашивать?
krypt 26.11.2012 04:20 # +1
Конкретно тут с циклом всё немного страшнее - надо либо сравнивать "!= 2" (но список индексов может измениться), либо использовать через множество. Множество из интегеров создаётся через зад.
Это как бы правильная реализация средствами фреймворка... но по-моему, это страшнее, чем было.
Можно сделать обычный массив
Но вся проблема в том, что сама идея изначального кода - безумна :)
QuickNick 26.11.2012 09:22 # +1