こんにちは私はユニバーサルアプリケーション(iPhone/iPad)に取り組んでいます。 1つの機能は、アルバムから写真を選択してUIImageViewに表示する必要があることです。
今問題はそれがiPhoneでうまく機能していることですが、フォトアルバムを開こうとするとクラッシュします。アクションシートデリゲートの私のコードはこれです:
- (void) actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){
if ( ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]))
{
if (buttonIndex == 0)
{
[self lockAllImagesOnTheScreen];
imagePicker.sourceType=UIImagePickerControllerSourceTypeCamera;
[self presentModalViewController:imagePicker animated:YES];
}
if (buttonIndex == 1)
{
[self lockAllImagesOnTheScreen];
imagePicker.sourceType= UIImagePickerControllerSourceTypePhotoLibrary;
[self presentModalViewController:imagePicker animated:YES];
}
}
else {
if (buttonIndex == 0)
{
[self lockAllImagesOnTheScreen];
imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
imagePicker.sourceType= UIImagePickerControllerSourceTypePhotoLibrary;
[self presentModalViewController:imagePicker animated:YES];
}
}
}
else{
if ( ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]))
{
if (buttonIndex == 0)
{
[self lockAllImagesOnTheScreen];
imagePicker.sourceType=UIImagePickerControllerSourceTypeCamera;
[self presentModalViewController:imagePicker animated:YES];
}
if (buttonIndex == 1)
{
[self lockAllImagesOnTheScreen];
imagePicker.sourceType= UIImagePickerControllerSourceTypePhotoLibrary;
[self presentModalViewController:imagePicker animated:YES];
}
}
else {
if (buttonIndex == 0)
{
[self lockAllImagesOnTheScreen];
imagePicker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
imagePicker.sourceType= UIImagePickerControllerSourceTypePhotoLibrary;
[self presentModalViewController:imagePicker animated:YES];
}
}
}
}
どんな体でも手伝ってくれる?私はstackOverflowをチェックし、それをググりましたが無駄でした。
UIImagePickerController
必須 iPadではUIPopoverController
が表示されます。
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:picker];
[popover presentPopoverFromRect:self.selectedImageView.bounds inView:self.selectedImageView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
self.popOver = popover;
} else {
[self presentModalViewController:picker animated:YES];
}
[〜#〜] edit [〜#〜]:UIPopoverController
の強力なプロパティを追加します:
@property (nonatomic, strong) UIPopoverController *popOver;
デリゲートメソッドでポップオーバーを閉じる必要があります。
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
ここでは、Swiftの方法を示します。
import UIKit
class StoreItemViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate
{
@IBOutlet weak var button: UIButton!
@IBOutlet weak var productImage: UIImageView!
var popOver:UIPopoverController?
@IBAction func buttonSelected(sender:UIButton)
{
if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.SavedPhotosAlbum)
{
var imagePickerController = UIImagePickerController()
imagePickerController.delegate = self
imagePickerController.sourceType = UIImagePickerControllerSourceType.SavedPhotosAlbum
imagePickerController.allowsEditing = false
if UIDevice.currentDevice().userInterfaceIdiom == UIUserInterfaceIdiom.Pad
{
self.popOver = UIPopoverController(contentViewController: imagePickerController)
self.popOver?.presentPopoverFromRect(self.productImage.bounds, inView: self.productImage, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)
}
else
{
self.presentViewController(imagePickerController, animated: true, completion: { imageP in
})
}
}
}
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
//do anything with the image
let selectedImage = info[UIImagePickerControllerOriginalImage] as UIImage
//closing the popup
popOver?.dismissPopoverAnimated(true)
}
func imagePickerControllerDidCancel(picker: UIImagePickerController)
{
println("cancel")
//closing the popup
popOver?.dismissPopoverAnimated(true)
}
}
Apple docsは言う
「現在アクティブなビューコントローラーのpresentViewController:animated:completion:メソッドを呼び出し、構成済みのイメージピッカーコントローラーを新しいビューコントローラーとして渡し、ユーザーインターフェースを提示します。iPadでは、ポップオーバーを使用してユーザーインターフェースを提示します。これを行うのは有効な場合のみです。画像ピッカーコントローラのsourceTypeプロパティがUIImagePickerControllerSourceTypeCameraに設定されている場合。」
それはそれがどのように動作するかとは正反対です!??ポップオーバーからUIImagePickerControllerSourceTypeCamera
を提示することができ、UIImagePickerControllerSourceTypePhotoLibrary
およびUIImagePickerControllerSourceTypeSavedPhotosAlbum
をモーダルに提示することができます。
奇妙な...
POST iOS 8:popOverコントローラーを追加してみてください
[[NSOperationQueue mainQueue] addOperationWithBlock:^ {}];
理由:これは、iOS 8では、アラートビューとアクションシートが実際にビューコントローラー(UIAlertController)で表示されるためです。したがって、UIAlertViewからのアクションに応答して新しいビューコントローラーを表示している場合は、それが表示されますUIAlertControllerが閉じられている間。ナビゲーションを妨げずにメインキューで実行する必要があります。
デバイスがiPadで、ソースタイプが「photoLibrary」または「savedPhotosAlbum」に指定されている場合、UIImagePickerControllerは、Apple docs。
func choosePhotoFromLibrary() {
let imagePicker = UIImagePickerController()
imagePicker.sourceType = .photoLibrary
imagePicker.delegate = self
imagePicker.allowsEditing = true
if UIDevice.current.userInterfaceIdiom == .pad {
imagePicker.modalPresentationStyle = .popover
present(imagePicker, animated: true, completion: nil)
let imagePickerPopOverPresentationController = imagePicker.popoverPresentationController
imagePickerPopOverPresentationController?.permittedArrowDirections = .up
let photoPickingTableCell = tableView.cellForRow(at: IndexPath(row: 2, section: 0))
imagePickerPopOverPresentationController?.sourceView = photoPickingTableCell
imagePickerPopOverPresentationController?.sourceRect = profilePhotoImageView.frame
}
else {
present(imagePicker, animated: true, completion: nil)
}
}
画像ビューを含むテーブルビューセルがあります。そのセルを選択するとイメージピッカーコントローラーを開く必要があるため、choosePhotoFromLibraryメソッドを呼び出します。この方法では、デバイスがパッドの場合、イメージピッカーのプレゼンテーションスタイルポップオーバーを割り当てて表示します。次に、ポップオーバーの動作を構成します。私の場合、sourceViewはイメージビューを含むテーブルセルで、sourceRectはイメージビューのフレームです。
デリゲートを割り当てると、UIPopoverPresentationControllerDelegateメソッドを利用することもできます。