2013年2月9日

Androidの画像ボヤけ

最近ご無沙汰ですが、実はしばらくWebアプリの仕事してました。
そうです。Javascriptです。
基本はiOSしか頭にないんですがwww、WebアプリだとどうしてもAndroidのことも考えなくてはなりません。

正直に書きますね。 もうね、Android4ね!爆発しろ! って思います。

もう、泥君のこまった点はいろいろあったんですが、そのうちの一つを書いてみたいと思います。
画像のボヤけです。 某国製の銀河三とかでよく出ます。

これの解決策は諸説ありますが、試して確実だったのは、

CSS3の3Dトランスフォームを使う

ってことでした。
ボヤケる画像や、それが背景になったdivなどに対して、


$("#hoge").css("-webkit-transition-duration","0");
$("#hoge").css("-webkit-transform","rotateY(0deg)");


とかやると、シャキっとします!

お試しあれ。


2012年11月21日

AT-METRONOME Version 2.60

楽器練習に最適! AT-METRONOME 久々にバージョンアップしました。
iPhone5の4インチRetina画面に対応したのが主な変更です。
なんかデザインが崩れてきて若干不満なんですが、いい案が思い浮かびませんでした・・・


バージョン 2.60 の新機能

iOS6に対応しました。
iPhone5とiPadで音色が選べるようになりました。
240BPMまで選べるようになりました。

2012年10月20日

AT-Shuffle LITE Version 2.1

AT-Shuffle LITE バージョンアップしてます。
2.1になってますが2.0からiPhone5、iOS6という、やや祭り的Ver Upに初めて対応しました!

条件: iPhone 3GS、iPhone 4、iPhone 4S、iPhone 5、iPod touch(第3世代)、iPod touch (第4世代)、iPod touch (第5世代)、およびiPad に対応。 iOS 5.0 以降が必要 iPhone 5 用に最適化済み

「iPhone 5 用に最適化済み」って表示がちょっとうれしい。
でも最近忙しいから、残りのアプリが面倒くさい・・・


バージョン 2.1 の新機能

画面回転時のバグ修正


2012年10月5日

UIActivityView

iOS6ネタなわけですが、これまたたまらないビューができました。

UIActivityViewです。

ぱっと見、最初は、ActionSheetのアイコン版かなーぐらいに思ってたんですが、全然違いました。 もっと強力です。
連携機能をつけたい場合が強力です。 いろいろできるようです。
しかし、とりあえず僕のような横着者向けなところに、最も涙しましましたよ。


今まではTwitter機能を装備するので精一杯でした。(おいおい)
もうカメラロールへの保存機能程度も面倒くさくてやめてしまう始末・・・。

しかし!iOS6では、

NSArray* actItems = [NSArray arrayWithObjects:twText, url, image, nil];
UIActivityViewController *activityView = [[UIActivityViewController allocinitWithActivityItems:actItems applicationActivities:nil];
[self presentViewController:activityView animated:YES completion:nil];


たったこれだけ、たったこれだけで上のキャプのような機能の実装が、コンプリートです!

この例では、NSString(twText),NSURL(url),UIImage(image)をアイテムとして与えています。
すると勝手に文字列、画像、URLに対応した連携機能がチョイスされて表示してくれるわけです。

なんか一気に多機能化される感じでいいですね〜。
殆どなんにもしてないくせに、しばらくはあたかもiOSらしい機能をがんばって組み込んだかのように思わせることができそうですね!(ダメ?)

連係機能は重要ですからね、さすがアップル!
(本音:iOS5ん時からからつけとけや…)

上のアプリはほんとはTwitterしか出来なかったんですけど、iOS5のときはそのまんまTwitterだけにするには、

if (activityView) {
    [self presentViewController:activityView animated:YES completion:nil];
}
else {
    TWTweetComposeViewController *twViewController = [[TWTweetComposeViewController allocinit];
    [twViewController setInitialText:twText];
    [twViewController addImage:image];
    [twViewController addURL:url];
        
    [self presentModalViewController:twViewController animated:YES];
}


みたいな感じで大丈夫そうです。


もうマジでみんな早くiOS6にアップデートしてください!
(責任は持ちませんがw)
僕のためにw  いや、結局はみんなのためだと思う!(キリッ)


2012年9月30日

UICollectionViewController



いやあ、遅ればせながら使ってみましたよ、iOS6のUICollectionViewController。
便利ですね〜、なんで今まで無かったの???感バリバリです。
僕はいままではこういうのはTableViewを使ってやってたんですけど、Arrayのnオブジェクト/1セルにしたりしてて気持ち悪かった・・・

使い方は簡単


@interface CollectionViewController : UICollectionViewController;


って感じのクラスに


//セクション数
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}

//セクション内の行数
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    //1セクションだけなので。myMpoってのはとある独自のデータオブジェクトです念のため
    return ([myMpo count]);   
}

//セルの描画
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell =
    [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];

    UIImageView *iv = (UIImageView*)[cell viewWithTag:66];  //66ってのはプロトタイプセルで定義してます。
    [iv setImage:[myMpo thumbAtIndex:indexPath.row]];
    
    return cell;
}

//タップされた時
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    self.detailViewController.detailItem = indexPath;
}


て感じでおk。 言いたいことは、もうほんとにTableViewとおんなじ
もう簡単すぎ!
もう一度書こう。

なんで今まで無かったの???

もうiOS5以下なんてゴミですね、(゚⊿゚)イラネ
(といいつつ僕はまだiPhone4Sで使ってるんだけど)




2012年8月19日

ある拡張子のファイルを自分のアプリで開けるように

これもわかりやすい情報があんまり無いなあ。
いや標準的なUTIの記述例ならあるんだけど。

例として、.abcという拡張子のファイルを、Safari等から自分のアプリ(com.hoge.yourAppというIDのアプリで)で開けるようにする場合。
多分正解では無いと思うけど、試行錯誤の結果、こんな感じで動きましたよという例として書いときます。

プロジェクトのInfoタブの「Document Types」と「Exported UTIs」をいじります。



ってな感じで、

info.plistとしては


<key>CFBundleDocumentTypes</key>
<array>
<dict>
<key>CFBundleTypeExtensions</key>
<array>
<string>abc</string>
<string>ABC</string>
</array>
<key>CFBundleTypeIconFiles</key>
<array>
<string>icon</string>
</array>
<key>CFBundleTypeMIMETypes</key>
<array>
<string>plain/abc</string>
</array>
<key>CFBundleTypeName</key>
<string>hogehoge File</string>
<key>LSHandlerRank</key>
<string>Owner</string>
<key>LSItemContentTypes</key>
<array>
<string>com.hoge.yourApp</string>
</array>
</dict>
</array>





<key>UTExportedTypeDeclarations</key>
<array>
<dict>
<key>UTTypeConformsTo</key>
<array/>
<key>UTTypeDescription</key>
<string>hogehoge File</string>
<key>UTTypeIdentifier</key>
<string>com.hoge.yourApp</string>
<key>UTTypeTagSpecification</key>
<dict>
<key>public.filename-extension</key>
<array>
<string>abc</string>
<string>ABC</string>
</array>
</dict>
</dict>
</array>



って感じ。
いらないのもあったりしそうだけど、あくまでも動いた例ってことでご了承を。
(MIME-Typeは要らないかも)


あとはAppDelegate.mを修正。 こっちは楽勝。

//オプション付きで起動されるとき

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    if (launchOptions) {
        NSURL *url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey];
        if ([url isFileURL]) {
            //とか、なんか処理;
        }
    }
    return YES;
}




//起動中に他のアプリから呼び出されるとき

- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url {
    if ([url isFileURL]) {
            //とか、なんか処理;
    }
    return YES;
}











2012年8月13日

UISplitViewController 1

覚書的な。
UISplitViewControllerって結構iPadでは必須コントローラだと思ってたので使ってみた。
しかし!ちょっと使いづらくないだろうか? みんなよく頑張ってるなと。
MGSplitViewController for iPadとかそういうの使うのかな?
まあ極力標準パーツで組みたい僕は標準のUISplitViewControllerで頑張ってみた。

とりあえず、右のDetailビューの中で、左右のPan(ドラッグ)を使いたかったんだ。
UIPanGestureRecognizer組み込んで、ポートレート表示で右にドラッグしたら、、、

マスタービューがひょこっと出てきやがる!

(ランドスケープ表示でも右ドラッグはUISplitViewControllerに奪われてる。)
どうにかならんもんかねこれ?
とりあえず、自前Panは2本指にすればいいかなって思って2Touchesに変更しても、まだひょこっと出てくる!

うーむ、どうやらUISplitViewControllerのUIPanGestureRecognizerのmaximumNumberOfTouchesが-1(無限)になってるらしい・・・
ってことで、こいつを無理やり1本指オンリーに変える。
DetailのコントローラのviewDidLoadあたりで、UIPanGestureRecognizerを探し出す。

for (UIGestureRecognizer *g in self.splitViewController.view.gestureRecognizers) {
    if ([g isKindOfClass:[UIPanGestureRecognizer class]]) {
        [(UIPanGestureRecognizer *)g setMaximumNumberOfTouches:1];
    }
}

これで自前の2本指ドラッグと共存できるようになりました。

2012年7月25日

AT-METRONOME Version 2.52

楽器練習に最適! AT-METRONOME 久々にバージョンアップしました。
前回のVerUpからなんと4ヶ月も経ってしまいました。
でも内容はなんてことありません。
In-App Purchaseにおいて、既に購入された方はリストアがわかりやすくなりました。
あとAdMobのライブラリを最新版にしています。


バージョン 2.52 の新機能

In-App purchaseにリストアボタン追加
AdMob lib アップデート

In-App Purchaseにハマる (リストア編)

久々にリジェクトされましたああ。 顛末はいちおう書いておこうと思います。

AT-METRONOMEのコードもしばーらく触ってなかったので、たまにはバージョンアップとかしないとなあ、って思ってバージョンアップしました。
最近ちょっと忙しいので、AdMobのライブラリを最新版にするだけの、正直どーでもいいバージョンアップw

ところが! リジェクトされました!

その1・アプリはいいんだけどさあ、In-App Purchaseのコンテンツがアップロードされてないじゃん? マニュアル読めよ
みたいなリジェクトでした。 えええ!? これはかなり???でした。 AT-METRONOMEのアプリ内課金の機能拡張は、制限解除する方式なので、実際はダウンロードするコンテンツなんて無いからです。
全くIn-App Purchaseの欄なんて触ってないのに…

いろいろ悩んで、AppLoader使ってIn-App Purchaseのプロジェクトをアップロードしろってこと? と思ってIn-App Purchaseを無理矢理更新してアップロードしてもIn-App PurchaseはWaiting for Uploadのまんま。
Hosting Content with Appleの項目もOFFにする方法わかんないし…
In-App Purchaseの更新を取り消す方法もわからずもう無理ですって感じでした。
アプリのほうのアップロードタイミングが関係するのかな? と思ってアプリのほうを再アップロードしたりしましたが、それでもわからずしばらくお手上げ。
ちょっとレビュアーへの質問考えるかなって思って、ちょっと放置しました。
(でもアプリのほうはWaiting for Reviewのまんまでほっといた)

そしたらまたリジェクトされたー

その2・リストアなのかなんなのかユーザーはわかんねーぞゴルァ マニュアル読め!
ああ、そ、そうですねって感じで今度はリストアボタン追加してアップロード。
今までそんなことなんにも言われなかったのになー
あとIn-App Purchase更新途中だったのでサンドボックスが使えなくなってたんだけど、なんかあっさり更新分消せました。

でまあ、めでたくReady for Saleになりました。

しかし・・・最初のリジェクトその1とはいったいなんだったのか???
関係ないやーーーん!

あんまり記憶が定かで無いんだけど、2回目のリジェクト後、In-App Purchaseの更新を削除するボタンが出現してた。 最初は無かったと思うんだよなあ〜。
丁度、AppStoreサーバーのトラブルにもぶつかっちゃったしorz
例のStore偽装の件でなんかいろいろ仕組みをちまちま変更してない?Apple?ブツブツ

In-App Purchaseに厳しくなってたり、シミュレータでアプリ内購入できなくなってたり、なんか前よりややこしくなってて焦ったw
やっぱりちょっと活動してないと置いてかれるなあw

そういえば関係ないけど、iTunes Storeで、音楽のプラスアップデートでも問題があって問い合わせたんだけど、質問自体をわかってもらえずじまいで;;、ちょっと最近アップルの対応に不満が増してます。


おまけ:リストアボタンのための主な追加部分はこんな感じ

- (IBAction)pushRestoreButton:(id)sender {
    
    [[SKPaymentQueue defaultQueue] addTransactionObserver:(id)self];

    NSSet *productIds = [NSSet setWithObject:@"プロダクトID"];
    skProductRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIds];
    skProductRequest.delegate = (id)self;
    // 購入履歴チェック
    [[SKPaymentQueue defaultQueue] restoreCompletedTransactions];
}

- (void) paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
{
    BOOL restore = NO;
    UIAlertView *alert;
    
    for (SKPaymentTransaction *transaction in queue.transactions) {
        // プロダクトIDが一致した場合
        if ([transaction.payment.productIdentifier isEqualToString:@"プロダクトID"]) {
            restore = YES;
            //NSLog(@"Restore OK!");
            [self completeUpgradePlus];
            [queue finishTransaction:transaction];
            
            alert = [[UIAlertView alloc] initWithTitle:@"Thank you." message:NSLocalizedString(@"restoresuccess", nil) delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alert show];
            
            break;
        }
    }
    
    // 一致するものがなかった場合
    if (restore == NO) {
        for (SKPaymentTransaction *transaction in queue.transactions) {
            [queue finishTransaction:transaction];
        }
        alert = [[UIAlertView alloc] initWithTitle:@"Cancel" message:NSLocalizedString(@"restorefail", nil) delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];

    }
}

// リストアに失敗した場合
- (void) paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error {

    UIAlertView *alert;
    
    alert = [[UIAlertView alloc] initWithTitle:@"Cancel" message:NSLocalizedString(@"restorefail", nil) delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
}

2012年5月21日

iPhoneで金環日食撮影

最近開発止まってしまっているのでなーんにもネタが無いのだが、少しは更新しないとまずいかなってことで無理やり書きます。

金環日食()
正直全然興味なかったんだけど、2日前ふらっと入ったLoftに日食グラス売ってて衝動でゲット。 なんか気持ち的に盛り上がってしまいましたw
で、ついに本日!かなりあいにくな天気のわりには結構な人でした。


結果から言うと、見て良かった!
雲が結構厚かったので、日食グラスはハッキリ言って役立たず!でしたが、
かわりに肉眼での素晴らしい輪の輝き!が見れました。
いやー感動。
※肉眼での太陽観察は極めて危険です。

周りで歓声の起こる中、なんの準備も無しに適当にiPhoneで撮りました。




まあほんとにちっちゃくしか映りませんねw
でも肉眼だと想像よりかなり大きく感じました。
これは肉眼で見ないと、わからないスケール感だと思いました。
天体観察に対する考えがちょっと変わりましたわw
心のカメラに収められて、ほんとに見てよかったと思います。