Google Playで検索してもゴミアプリしかなかったんで作りました!
続きを読む
主にえろい画像を検索する「二次元画像詳細検索」サイトの非公式アプリ*1として、iOS/Androidの両プラットフォーム向けにアプリを公開しました。
https://itunes.apple.com/jp/
https://play.google.com/store/
Webサイトがスマホ対応されてなく、iOS/Androidだと画像をアップロードして画像検索出来なかったので本アプリを作りました。
クライアントアプリでローカルの画像をアップロードして検索、URLを入力して検索する事が可能です。
AndroidはブラウザからURLを本アプリに共有する事で手軽に画像検索出来ます。iOSにその機能はありません。
アイコンとスクリーンショットが両プラットフォームともヤッツケなので変更する予定です。
Windowsストアアプリに移植しました。
非公式アプリ「二次元画像詳細検索」をWindowsストアで公開 - hyoromoのブログ
*1:非公式ではありますが、サイト管理者様への許可は頂いています
前回「AppleにリジェクトされそうなiOSアプリを作ってみた」を書きましたが、リジェクトされる事なく version 1.0.0 をリリース出来ました!
より好みアプリランキング
カテゴリ: エンターテインメント, 仕事効率化
(゚∀゚ノノ゙パチパチパチパチ
やったーー、Appleがついにデレたのか!デレたのか!!
審査に通過しないと思っていたので適当に作っていた「アプリアイコン」「スクリーンショット」を綺麗に作り直し、使い勝手の向上や細かい不具合を取り除いて...
アップデート申請!
↓
(一週間経過)
↓
リジェクト
↓
(´;ω;`)
機能自体は一切変えていないのにリジェクトされるとは...
リジェクト番号は 2.25 、理由はApp Storeに似ているからダメ。されると思ったこのリジェクト。
最初に言えよ!と思うも、たぶんAppleのレビュワーとやり取りしても解決しないんだろうなあ...
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:@"画像名"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self action:@selector(イベント名:)]; self.navigationItem.rightBarButtonItem = item;
ポイントは imageWithRenderingMode で UIImageRenderingModeAlwaysOriginal を指定する事。これはiOS7から追加されており、指定しないと UIImageRenderingModeAutomatic がデフォルト設定され、ボタンが真っ青になってしまいます。
今回はCocos2d向けUI作成ツール「CocosBuilder」を使ってマルチ解像度対応したUIを作っちゃおう!な内容を書きます。Cocos2d-xのセットアップが未だな場合は前回エントリーを参照ください。
CocosBuilderページからどうぞ。利用しているCocos2d-xのバージョンと対になるCocosBuilderのバージョンが存在する為、よくバージョン番号を確認してからダウンロードしてください。
今回は横向きの画面を作成します。
「Create a new Document」ダイアログ上で設定した表示解像度は、CocosBuilderのメニューにある「Document > Edit Resolutions」から編集できます。表示解像度の種類を増やすとメニューにある「Document > Resolutions」から表示解像度毎の見た目に切り替えて確認できます。
Cocos2dxで作成したプロジェクト内の「Classes > AppDelegate.cpp」を開いて「AppDelegate::applicationDidFinishLaunching」メソッド内に以下のコードを追加します。なお、今回は横向きを想定しての数値設定な為、もし縦向き対応させる場合は縦横の設定値を全て逆にする必要がある
bool AppDelegate::applicationDidFinishLaunching() { // initialize director CCDirector *pDirector = CCDirector::sharedDirector(); pDirector->setOpenGLView(CCEGLView::sharedOpenGLView()); /* ここから追加コード */ CCSize designSize = CCSizeMake(480, 320); // ベースサイズ CCSize resourceSize; CCSize screenSize = CCEGLView::sharedOpenGLView()->getFrameSize(); std::vector<std::string> searchPaths; std::vector<std::string> resDirOrders; TargetPlatform platform = CCApplication::sharedApplication()->getTargetPlatform(); if (platform == kTargetIphone || platform == kTargetIpad) { searchPaths.push_back("Published-iOS"); CCFileUtils::sharedFileUtils()->setSearchPaths(searchPaths); if (screenSize.height > 768) { resourceSize = CCSizeMake(2048, 1536); resDirOrders.push_back("resources-ipadhd"); } else if (screenSize.height > 640) { resourceSize = CCSizeMake(1536, 768); resDirOrders.push_back("resources-ipad"); } else if (screenSize.height > 480) { if (screenSize.width < 1536) { // 4インチ resourceSize = CCSizeMake(1136, 640); } else { // 3.5インチ resourceSize = CCSizeMake(960, 640); } resDirOrders.push_back("resources-iphonehd"); } else { resourceSize = CCSizeMake(480, 320); resDirOrders.push_back("resources-iphone"); } CCFileUtils::sharedFileUtils()->setSearchResolutionsOrder(resDirOrders); } else if (platform == kTargetAndroid) { if (screenSize.height > 1200) { resourceSize = CCSizeMake(1200, 800); resDirOrders.push_back("resources-xlarge"); } else if (screenSize.height > 960) { resourceSize = CCSizeMake(960, 640); resDirOrders.push_back("resources-large"); } else if (screenSize.height > 480) { resourceSize = CCSizeMake(720, 480); resDirOrders.push_back("resources-medium"); } else { resourceSize = CCSizeMake(568, 320); resDirOrders.push_back("resources-small"); } CCFileUtils::sharedFileUtils()->setSearchResolutionsOrder(resDirOrders); } pDirector->setContentScaleFactor(resourceSize.width / designSize.width); CCEGLView::sharedOpenGLView()->setDesignResolutionSize(designSize.width, designSize.height, kResolutionFixedHeight); /* ここまでが追加コード */ // turn on display FPS pDirector->setDisplayStats(true); // set FPS. the default value is 1.0/60 if you don't call this pDirector->setAnimationInterval(1.0 / 60); ScriptingCore* sc = ScriptingCore::getInstance(); sc->addRegisterCallback(register_all_cocos2dx); sc->addRegisterCallback(register_all_cocos2dx_extension); sc->addRegisterCallback(register_all_cocos2dx_extension_manual); sc->addRegisterCallback(register_cocos2dx_js_extensions); sc->addRegisterCallback(register_CCBuilderReader); sc->addRegisterCallback(jsb_register_chipmunk); sc->addRegisterCallback(jsb_register_system); sc->addRegisterCallback(JSB_register_opengl); sc->addRegisterCallback(MinXmlHttpRequest::_js_register); sc->addRegisterCallback(register_jsb_websocket); sc->start(); CCScriptEngineProtocol *pEngine = ScriptingCore::getInstance(); CCScriptEngineManager::sharedManager()->setScriptEngine(pEngine); ScriptingCore::getInstance()->runScript("main.js"); return true; }
コードはCocosBuilderのメニュー上の「Help > CocosBuilder User Guide」の「4c」とほぼ同じです。リソースの読み込み先を指定し、端末解像度に合わせてUIをスケールさせてます。
CCEGLView::sharedOpenGLView()->setDesignResolutionSize は最後の引数に設定する値はスケール方法となっており以下の値が設定可能です
値 | 意味 |
---|---|
kResolutionExactFit | 画面比率を無視して、端末解像度に合わせて設定する。はみ出しや余白が生じない |
kResolutionNoBorder | 画面比率を維持して、端末解像度いっぱいに設定する。縦横のどちらかがはみ出る |
kResolutionShowAll | 画面比率を維持して、端末解像度に合わせて設定する。縦横のどちらかに余白が生じる |
kResolutionFixedHeight | 画面比率を維持して、端末解像度の高さに合わせて設定する。横がはみ出しや余白が生じる |
kResolutionFixedWidth | 画面比率を維持して、端末解像度の幅に合わせて設定する。縦がはみ出しや余白が生じる |
上記サンプルコードは「main.js」を読み込む事で「MainScene.ccbi」を読み込んでいます。jsを介さなくても以下のようにcpp側からccbiファイルを直接読み込むことが出来ます。
cocos2d::extension::CCNodeLoaderLibrary *lib = cocos2d::extension::CCNodeLoaderLibrary::newDefaultCCNodeLoaderLibrary(); cocos2d::extension::CCBReader *reader = new cocos2d::extension::CCBReader(lib); CCScene *scene = reader->createSceneWithNodeGraphFromFile("MainScene.ccbi"); pDirector->runWithScene(scene);
Cocos2dxで作成したプロジェクト内の「proj.android > build_native.sh」をテキストエディタで開き、以下のように置き換えます。
# 以下の2行を # copy Resources/* into assets' root cp -rf "$APP_ROOT"/Resources/* "$APP_ANDROID_ROOT"/assets # 以下の2行に置き換え # copy CocosBuilder//Published-Android/* into assets' root cp -rf "$APP_ROOT"/(UI専用プロジェクト名)/Published-Android/* "$APP_ANDROID_ROOT"/assets