У меня возникла странная проблема при попытке представить MPMediaPickerController с помощью presentModalViewController. У меня он работал нормально, но недавно (возможно, с версии 3.1, я точно не помню, когда он работал в последний раз) MPMediaPickerController просто отказывается показывать себя. Экран остается черным, наверху нет ничего, кроме строки состояния, и я вынужден выйти из приложения.
Вот мой код:
// Show the music picker, allowing the user to create a playlist
- (void) showMusicPicker;
{
[[Director sharedDirector] pause];
[[Director sharedDirector] detach];
musicView = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
[window addSubview:musicView];
musicController = [[UIViewController alloc] init];
[musicController setView:musicView];
[musicController setModalTransitionStyle: UIModalTransitionStyleCoverVertical];
MPMediaPickerController *picker =
[[MPMediaPickerController alloc] initWithMediaTypes: MPMediaTypeMusic];
picker.delegate = self;
picker.allowsPickingMultipleItems = YES;
picker.prompt = @"Select songs to play";
// The media item picker uses the default UI style, so it needs a default-style
// status bar to match it visually
[[UIApplication sharedApplication] setStatusBarHidden:NO animated: YES];
[musicController presentModalViewController: picker animated: YES];
[picker release];
}
Как видите, он в основном дословно скопирован из примеров Apple с некоторыми модификациями, чтобы заставить его работать с Cocos2D. Переменная окна в коде - это окно приложения, которое сохраняется в методе инициализации:
// Remember the window that the director is attached in
window = [[[[Director sharedDirector] openGLView] window] retain];
Остальная часть метода работает нормально ... директор отсоединяется от окна, и появляется строка состояния. Но тогда на экране должен появиться MPMediaPickerController, а его нет. Как я уже упоминал, не так давно он работал нормально, поэтому я не понимаю, что здесь происходит.
Спасибо за любую помощь, которую вы можете предоставить.
Изменить: я заметил, что если я закомментирую эти строки:
[[Director sharedDirector] pause];
[[Director sharedDirector] detach];
[window addSubview:musicView];
и замените их на:
[[[Director sharedDirector] openGLView] addSubview: musicView]
... тогда контроллер выбора отображается в том виде, в каком он должен быть. Именно так я добавил представление, когда впервые реализовал доступ к библиотеке iPod после выхода версии 3.0, поскольку он немного менее запутан, чем нынешний. Однако проблема с этим методом заключается в том, что после закрытия контроллера средства выбора все координаты касания, которые сообщаются мне при событиях касания, становятся неточными - они примерно на 20 пикселей выше, чем должны быть (портретная ориентация). не уверен, что это ошибка Cocos2D или что-то в этом роде, но это в значительной степени исключает представление контроллера непосредственно в openGLView директора.