ずいぶん遅くなっている感じもするが、iOS8対応がだいぶ進んだので対応内容を少しづつ書いてこうと思う。
結構よく使うUIが変更となった為、ある程度処理をまとめる事が出来ないか考えていると時間がかっかた。
まずは、「UIPopoverController」で行った対応内容。
既にたくさん情報が出ているように、「UIPopoverController」が使えなくなり、それに置き換えるように、「UIPopoverPresentationController」を使う事になった。
さらに、iPhoneでも使えるようになったので、iPhoneでの表示に無理矢理感が無くなった。
当然、iOS8以前では使えないので、バージョンによって処理を分ける必要が出てきた。
その辺りを考えて処理をまとめて下記のようなものを作った。
// Popoverの初期化
-(UIPopoverController *)uipopoverViewInit:(UIViewController *)mainView addView:(UIView *)addView sourceView:(UIBarButtonItem *)sourceView
{
UIPopoverController *popoverView;
if ([UIPopoverPresentationController class]) {
// iOS バージョンが 8 以上で、UIPopoverPresentationController クラスが利用できる場合
CGSize screenSize = [[self mainScreen] bounds].size;
UIView *backView = [[UIView alloc] init];
backView.frame = mainView.view.bounds;
backView.backgroundColor = [UIColor blackColor];
backView.alpha = 0.3;
backView.hidden = YES;
[mainView.view addSubview:backView];
[mainView.view addSubview:addView];
addView.center = CGPointMake(screenSize.width/2, (screenSize.height/2)-30);
mainView.modalPresentationStyle = UIModalPresentationOverFullScreen;
UIPopoverPresentationController *popPC = mainView.popoverPresentationController;
popPC.barButtonItem = sourceView;
popPC.permittedArrowDirections = UIPopoverArrowDirectionAny;
popoverView = nil;
}else{
// iOS バージョンが 8 以前で、UIPopoverPresentationController クラスが利用できない場合
mainView.view = [addView initWithFrame:addView.bounds];
mainView.contentSizeForViewInPopover = addView.bounds.size;
popoverView = [[UIPopoverController alloc]initWithContentViewController:mainView];
}
addView.hidden = YES;
return popoverView;
}
// Popoverのを開く
-(void)uipopoverViewOpen:(UIViewController *)openView sourceView:(UIView *)sourceView popoverView:(UIPopoverController *)popoverView controller:(id)controller
{
if ([UIPopoverPresentationController class]) {
// iOS バージョンが 8 以上で、UIPopoverPresentationController クラスが利用できる場合
UIView* backView = [openView.view.subviews objectAtIndex:0];
backView.hidden = NO;
backView.alpha = 0.3;
[controller presentViewController:openView animated:NO completion:nil];
// 背景をタッチしたら、Popoverを隠す
UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget: controller action:@selector(closePopoverView:)];
[backView addGestureRecognizer:gestureRecognizer];
}else{
// iOS バージョンが 8 以前で、UIPopoverPresentationController クラスが利用できない場合
[popoverView presentPopoverFromRect:CGRectMake(sourceView.frame.origin.x + (sourceView.frame.size.width / 2),
sourceView.frame.origin.y + (sourceView.frame.size.height / 2), 0, 0)
inView:controller.view
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
}
}
// Popoverのを閉じる
-(void)uipopoverViewClose:(UIViewController *)closeView popoverView:(UIPopoverController *)popoverView
{
if ([UIPopoverPresentationController class]) {
// iOS バージョンが 8 以上で、UIPopoverPresentationController クラスが利用できる場合
UIView* backView = [closeView.view.subviews objectAtIndex:0];
backView.hidden = YES;
[closeView dismissViewControllerAnimated:NO completion:nil];
}else{
// iOS バージョンが 8 以前で、UIPopoverPresentationController クラスが利用できない場合
[popoverView dismissPopoverAnimated:NO];
}
}
-(void)closePopoverView:(id)sender
{
// Popoverを閉じる
[self uipopoverViewClose:closeView popoverView:nil];
}
こののように初期化、開く処理、閉じる処理をまとめたものを作った。
そして一番下のものが、背景部分をタッチした時に画面を閉じる処理。
これを行わない場合、表示させたpopoverの欄外をタッチしても何も起きない。
uipopoverの場合は、自動で閉じる処理が行われるようになっていたが、今回からは自分で実装する必要があるらしい。
その為に、このような処理まで新規に追加する必要がある。
これらを、セットで呼び出す事で、コールする側ではiOSのバージョンを意識する必要が無い。
使う場所では、初期化、開く、閉じるの3行のみですむ。
何カ所もある場合には、かなり有効に感じる。
ここまではよかったのだが、少し、今までと変わってしまったところがある。
表示位置の指定が、いまいちよく分からないのだ。
もともと、popover自体が、barbuttonitemにくっついて表示するようになっていて、今回も同じだが、指定の仕方で、好きな位置に表示させる事が出来ていた。
しかし、今回は、自由に指定する事が出来ていない。
パラメータを見ていろいろと試したが、結局分からなかった。
これについては、一通り対応が終わってからもう一度調べてみる必要がありそうだ。
今回は、ひとまず、真ん中に表示するけど、これでOKにする事にした。
まだ、全ての確認が終わった訳ではないので、間違いがあるかもしれませんが、参考になればよいです。
[3回]
PR