У меня есть UIPickerView, который анимирует вверх и вниз в UITableViewController. Я адаптировал пример от Apple (DateCell). UIPickerView создается программно, без перьев.
В портретном режиме все выглядит хорошо. Когда я вращаю симулятор (я не тестировал на устройстве), UITableView вращается хорошо, но сборщик остается, где бы он ни был. Я читал множество тем на эту тему, и у многих разработчиков, похоже, есть проблемы со сборщиками, которые ведут себя странно в ландшафтном режиме, но по крайней мере их сборщики вращаются. Я сделал подкласс UIPickerView, как описано в этой ссылке: http://www.llamagraphics.com/developer/using-uidatepicker-landscape-mode,, но это не помогло с проблемой поворота.
Я пытался повернуть подборщик с помощью трансформации, но это выглядело очень странно, как сломанный.
Я подозреваю, что проблема в том, что я использую средство выбора внутри UITableViewController, и поэтому я добавляю его как подпредставление self.view.window. Если я попытаюсь добавить средство выбора как подпредставление self.view, появится только белая рамка (без средства выбора).
Есть предложения?
Код инициализации в подклассе UITableViewController:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (self.pickerView.superview == nil)
{
//Initialization code
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
CGRect initFrame = orientation == UIInterfaceOrientationPortrait ? CGRectMake(0, 0, 320, 200) : CGRectMake(0, 0, 480, 160);
self.pickerView = [[RotatingUIPickerView alloc] initWithFrame:initFrame];
[self.pickerView setDelegate:self];
[self.pickerView setShowsSelectionIndicator:YES];
[self.pickerView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleTopMargin];
[self.view.window addSubview:self.pickerView];
// compute the start frame
CGRect screenRect = [[UIScreen mainScreen] applicationFrame];
CGSize pickerSize = [self.pickerView sizeThatFits:CGSizeZero];
CGRect startRect = CGRectMake(0.0,
screenRect.origin.y + screenRect.size.height,
pickerSize.width, pickerSize.height);
[self.pickerView setFrame:startRect];
// compute the end frame
CGRect pickerRect = CGRectMake(0.0,
screenRect.origin.y + screenRect.size.height - pickerSize.height,
pickerSize.width,
pickerSize.height);
// start the slide up animation
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3];
// we need to perform some post operations after the animation is complete
[UIView setAnimationDelegate:self];
[self.pickerView setFrame:pickerRect];
[UIView commitAnimations];
}
}
Реализация подкласса UIPicker, как описано по ссылке выше:
- (id)initWithFrame:(CGRect)frame
{
if (self == [super initWithFrame:frame])
{
for (UIView * subview in self.subviews)
{
[subview setFrame:self.bounds];
}
}
return self;
}
- (id) initWithCoder:(NSCoder *)aDecoder
{
if (self == [super initWithCoder: aDecoder])
{
for (UIView * subview in self.subviews)
{
[subview setFrame:self.bounds];
}
}
return self;
}