忍者ブログ
[1] [2] [3] [4] [5] [6] [7
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


数日前に、iOS8対応が終わったつもりでこのブログを書いていたが、まだ漏れがあった。
確認が甘い事を改めて感じてしまった。

漏れていた内容としては、アクションシートをiPadで表示する時の処理に漏れがあった。
iPadの場合は、アクションシートを表示させる為には、ポップオーバーにしなければ行けないようになったらしい。

このサイトを参考にさせてもらった。

基本的には前に書いたように、「UIAlertControllerStyleActionSheet」を指定した「UIAlertController」を使う。 
そこは問題なかったが、それだけではiPadで動かすとアプリが落ちてしまった。
上記のサイトにあるものを追加するだけで問題なく表示できた。
ただ、ここで意外な落とし穴があった。

各UIパーツの初期化をまとめて行うように書いていたため、iPadで不足する処理も同じところに書いていたら、1回目だけしか動かなかった。
どうやら「popoverPresentationController」の指定は、表示を行う毎に行う必要があるらしい。
この辺りが非常に分かりにくいが、試しながら確認していくしかないものかと思う。

拍手[0回]

PR

iOS8の対応を書いていこうと思っていたが、よく考えると、そんなにたくさん分けるほどの事をしていなかった。
 その為、2回目だが、その他になる。
しかも、その内容は、既に書かれている内容をそのまま入れただけなので、そこの紹介。

iOS7 と iOS8 の、両方に対応したアプリを作る
ここを参考に、残りを全て対応した。
それだけなのだが、時間がかかってしまった。

上記のページでは、「UIAlertView」になっているが、「UIActionSheet」も同じ。
「preferredStyle」に設定されている「UIAlertControllerStyleAlert」を「UIAlertControllerStyleActionSheet」へ変更することで、アクションシートが表示される。
他の使い方は全く同じ。 必要な分、ボタンを追加すればよい。

たったこれだけなので、本当はもっと簡単に対応できるはずであった。
ここで、処理をまとめる事を考えてみたのだが、結果的に断念し、そのまま書く事にした。
時間をかけて考えた結果、あきらめてそのままという、最も効率の悪い方法になってしまった。
(良い方法を考えた方は是非教えてほしい)

これだけだと、あまりにも内容が無いので、個人的に躓いた部分を書いておく。

Alertを置き換えたのだが、表示されないケースがあり、暫く悩んでしまったが、単純なミスだった。
UIPopoverで表示させている部分を選択したときに表示させるAlertを使用していた。
iOS8からは、UIPopoverが、単純なUIパーツから、「UIViewController」となっている為、表示場所をきちんと指定しないと行けない。
ここに気がつかずに、「self」を指定してしまい、おそらく、UIPopoverの後ろに表紙させていた。
ここを、最前面にきているViewを指定する事で、問題なく表示された。
UIの操作にあまり慣れていない為に、こんな事にすら気がつかなかった。

一応、これらを入れる事でiOS8の対応は終わったので、既に気がついている不具合の対応を行ってから申請を行う予定。
さらに、まだ、対応したのは1つ目のアプリのみなので、他のアプリも同じものを入れていく必要がある。
まだまだ、先が長い気がしてしまう。

拍手[0回]


ずいぶん遅くなっている感じもするが、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回]


ふと気がつくと1月以上も放置状態になっていた。

最近、なんだかアプリ開発が進まなくて、その結果、ここに書くネタもなかなか無い。
そんな中、久々にものすごくちょっとした事で引っかかってしまった。

やりたかった事はとても単純。
UILabelに対して2行の文字列を表示しようとしただけ。

当然「numberOfLines」に行数を入れて、文字列に改行コードを入れるだけ。
改行コード「\n」に使う「\」が出しにくい等はあるが、検索すれば直に出てくる。
(ちなみに「option」+「¥」押下)

動かしてみたところ、iOS6では問題ないが、iOS7では、改行されなかった。
ネットでさんざん検索し、本もいくつか見たが何もおかしなところはなさそうに見えた。
結果的には、上に上げた無いように問題は無かった。

何を間違っていたかと言えば、UILabelのサイズの指定がだめだった。

今回は、元々1行表示していたところを2行表示に変更しようとした。
そのため、サイズの指定を単純に前の2倍に指定した。

OSの違いで文字間隔が違うようだ。
この為に、iOS7の場合のみ、改行すると入らなくなってしまう為、改行されなかった。

すごく初歩的な事でたったのだが、意外と忘れがちだと思うので、メモってみる。

拍手[0回]


久々にブログの更新!

さらに、今回は、本来の開発に関する事を書きたい。
内容としては、タイトルにあるように地図アプリを作った時のピンドロップ。

前提として、マップの表示ができていて、現在地の表示も可能、ピンの設定も可能ということ。
そこまでの事については、「xcode map」で検索すると分かりやす解説がたくさん出てくる。

今回躓いたポイントは、現在地へピンを落としたい時の処理。

 Marking Map Plusで試し中

現在地のポイントをタップすると、上記のように表示されるだけで、ロングタップしてもピンの設定は出来ない。
タッチイベントが、現在地の青丸に対して動作してしまうので、マップへのピン設定の処理へは回っていかないようだ。
結果的に、ピンの設定は出来ない。
他のピンと同じ位置へのピン設定も同様に出来ないと思う。
(この辺りはあまり細かく試してはいない)

ここから、いろいろと試行錯誤が始まった。
当然、ネットでこの点に関して検索もしてみたが、見つける事が出来なかった。
英語で書かれている記事を読むとあったのかもしれないが・・・

現在地の青丸を変更し、オリジナルで作成を行った場合は、ボタンを追加する事は可能であった。
現在地のアイコンを設定する場合はこれでも問題ないと思うが、それ以外は、現在地表時が変わってしまう。
標準の青丸がいいという訳ではないが、既に、リリースしているアプリだし、標準のマップと同じなので、分かりやすい。
なので、出来る事なら、標準の青丸にボタン追加したいと思った。

それを前提に、いろいろと試してみたのだが、どうもうまくいかない。
そのままでは、青丸のカスタマイズは難しいようだ。

ここで、青丸のカスタマイズについても含めて検索し、やっと見つけた。

参考ししたサイトは、ここ

もともとは、青丸の色を変えたかったようだが、その結果作成しているものを参考にした。

「MKAnnotationView」のサブクラスの独自のクラスを作成している。
その中に、色指定を可能にしているので、自分の好きな色に変更できるようだ。

今回は、自分のしたい事は色指定ではないので、自分のしたいカスタマイズがかのであるかも含め、クラスの内容を見てみた。
じっくりと読んだ訳ではないが、ざっと見ると、自力で標準と同じ青丸を作成しているようだった。
(これは、自分も考えたが、大変そうで自力では無理だとあきらめた事をやっているようだ)
結果的には、通常のピンと同じようにボタン追加が可能であったので、ボタンを追加。

最終的には 下記のように「ピンを設定」と表示しているボタンの追加が出来た。




このボタンを押した時の処理に対して、現在地の緯度経度を元にピンを設定してやると下記のようになった。



これで、やりたい事が実現できた。

次のバージョンアップでは、これを入れて出そうと思う。
他の内容をいくつか入れて、不具合対応をしてからのリリースかな。

拍手[0回]


リリース済みアプリ

Silmuvide


PseudoRPT


うつすと!


ChronologyMaker


LASI


3行日記


単位計算機


Marking Map Plus


交通費管理


交通費計算リスト


Markin Map


SheepSleepSheep


RootCalculator


元号変換


PieChart


MeasureShooting


SimpleMapCreator



Applivのレビュー記事
http://app-liv.jp/713163900/

ゆびてんじ


PR



Copyright ©   marble seijin の開発日記   All Rights Reserved
Design by MMIT simple_plain Powered by NINJA TOOLS
忍者ブログ [PR]