Storyboardなんか使わない方がいい

iOSアプリを趣味やら仕事やらでほそぼそと作っていますが、 Storyboardを使う意味がよく分かりません。なんなんでしょうあの子。 でも 「なんで必要ないの?」 と聞かれると 「なんか色々めんどくせぇ。てやんでぃ」 としか言えなかったのですが、「ここがめんどくさい!」という部分がまとまった記事がありました。 ⇒ Q. StoryboardとXIBはどう使い分ければいいんだろうか? – Qiita 最近よく見るQiitaのまとめです。 (どうでもいいけどここに投稿している人ってみんなエンジニアなのにどうして自分のブログとかに書かないんだろう。使いやすいのかしら。) ってなわけで、Storyboardがいらないという理由の要点をまとめてみます。 Storyboardがいらない理由その1 「こんがらがる」 小規模ならまだしも、 規模が大きくなるとその分ページが増えて行きます。 こちらの画像はApplivのアプリのStoryboardです。(画像元:Catcher in the tech) (執筆時にはApp Storeから消えてました。何かあったのかな。) どうでしょう。確かに一見仕事してる感がムンムンと出てて、なんか待ち受けにしたいくらいカッコいいです。本音を言うと、したくはないです。 ここに新たなViewControllerを追加する場合、拡大したりスクロールしたり、色々探しまわって繋いで… 想像するたけで、汗がタラタラ出て来ます。本音を言うと、出て来はしないです。 Storyboardがいらない理由その2 「チーム開発に不向き」 Storyboardでコンフリクトが起きると、これを解消するのがすごく大変。 コードレビューも大変。打ち間違いに気づかない場合も多いです。 あと性格にもよりますが、ViewControllerをさっきの画像のようにきちっと並べたい。 誰かがズラしたり、新しいViewControllerが挿入されると直したくなります。でもまたズレるのさ。 Storyboardがいらない理由その3 「柔軟性がない」 おそらく一番大きな理由でしょう。 「このタイプのセルの背景はこの色で統一しよう。」⇒#defineで用意した値を入れられないから、スクロールして拡大して、探し回って同じ色を入力しなければならない。「やっぱり違う色にしよう」⇒スクロールして拡大して、探し回って…「あ、待って。やっぱりこの色にしよう」⇒ゲロゲロ UIImageViewの上にaddSubview出来なかったり、UIViewContllorの型が変更できなかったり、コードならささっと出来ることも大変な作業量になってしまうことがあります。 オシャレなアニメーションなんかはやっぱりコード上でないと実装できないです。 Storyboardを使わない方がいい理由まとめ ・Storyboardで出来ることは全てコードで出来る。(Storyboardでは出来ないことがある。) ・規模が大きくなると、Storyboardで得られるメリットよりデメリットの方が大きくなる。 ・なんか色々めんどくせぇ。てやんでぃ 今から、iPhoneアプリ作りを始める方は是非Storyboardなしでやった方がいいと思います。 ⇒ Xcode6でもストーリーボードなしのEmpty Applicationから始めたい

View More

さくらVPSにSSLを登録する 後編

どうもみなさんご機嫌よう。あっきぃです。特技は猫背です。 前回は見事にSSL証明書の発行を完了させました。 ⇒ さくらVPSにSSLを登録する 中編 前編、中編、後編となっているので見てない暇な人は全部見てみると良いです。 さて今日はいよいよ証明書をさくらVPSに設置し、SSL通信出来るようにします。 5.SSL証明書のインストール インストールと言っても、サーバー上にコピペするだけです。 ルートになって、Apacheの設定ディレクトリへ移動します。 $ sudo su# cd /etc/httpd/conf/ こんな感じのメールが来ていましたが、波線も含めてコピーしてください。 こんな感じで拡張子が「crt」なファイルへコピペします。 (※vimの使い方が分からない人は調べるか、別のエディタを使うか echo ” > とか、scpでアップロードするとかしよう!) # vim ./ssl/appstars.jp.20151104.crt ここまで手順通りに来ているのであればlsコマンドを入力するとこんな感じ。 # ls ./sslappstars.jp.20151104.crtappstars.jp.20151104.csrappstars.jp.20151104.key うむ。 6.中間証明書のインストール なんだ中間証明書って… まぁ、あっきぃはIQが非常に高いので、この名前だけで何をするのか分かってしまいます。おそらく中間を証明するのでしょう????? 今回は「SecureCore・ドメイン認証SSL」なので、こちら↓から中間証明書をコピペします。 ⇒ 中間証明書の取得 – ドメイン認証SSL用 SSLボックス SSLボックスのそれ以外のプランの方はこちら↓から探してください。 ⇒ サポートマニュアル/年額790円(税抜)からの格安SSL証明書サービス SSLボックス 例のごとく波線も含めてコピーです。 ファイル名は「securecore.inter.crt」とでもしておきましょう。 # vim ./ssl/securecore.inter.crt lsするとこう。 # ls ./sslappstars.jp.20151104.crtappstars.jp.20151104.csrappstars.jp.20151104.keysecurecore.inter.crt うむうむ。 7.SSL設定ファイルの編集 ssl.confの内容をちょっと変えます。 バーチャルホストを使っている前提で書きます。 # […]

View More

iPhoneで時々Tweetボタンが表示されない時

こんにちは。 最近近くのコンビニは「取り出すのにお金が掛かる自分の冷蔵庫」と考えるようにしました。 さて、冷蔵庫と言えばTweetボタンですが、最近なんだかiPhoneで表示されない時がしばしば。 原因は謎ですが、最新コードと差分があったので書き直します。 ⇒ Twitter Buttons Generator いままで(JS部分) !function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=” //platform.twitter.com/widgets.js”;fjs.parentNode.insertBefore(js,fjs);}}(document,”script”,”twitter-wjs”); 新しいの(JS部分) !function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?’http’:’https’;if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+’: //platform.twitter.com/widgets.js’;fjs.parentNode.insertBefore(js,fjs);}}(document, ‘script’, ‘twitter-wjs’); なんかtestとか気になる関数が追加されてます。 こちらに変更したところばっちぐーで表示されるようになりました。めでたし。 要するに あれ?なんかおかしいなと思ったら本家のサイトからコードを取得し直すと良いカモ。ということです。 ⇒ Twitter Buttons Generator ではでは。

View More

UIViewのframe.size.widthとかめんどくさいので省略する

UIViewの幅や高さにアクセスするのがめんどくさいので省略出来るようにします。 UIView+Simple.h/mという名前のUIViewを拡張するカテゴリファイルを追加します。 //UIView+Simple.h #import <UIKit/UIKit.h> @interface UIView (Simple)-(CGFloat)width;-(CGFloat)height;-(CGFloat)x;-(CGFloat)y;-(CGPoint)o;-(CGFloat)right;-(CGFloat)bottom;-(void)toFront;-(void)toBack;-(CGSize)trueSize;@end //UIView+Simple.m #import “UIView+Simple.h” @implementation UIView (Simple)-(CGFloat)width { return self.frame.size.width; }-(CGFloat)height { return self.frame.size.height; }-(CGFloat)x { return self.frame.origin.x; }-(CGFloat)y { return self.frame.origin.y; }-(CGPoint)o { return CGPointMake(self.width / 2, self.height / 2); }-(CGFloat)right { return self.frame.origin.x + self.frame.size.width; }-(CGFloat)bottom { return self.frame.origin.y + self.frame.size.height; }-(void)toFront { [self.superview bringSubviewToFront:self]; }-(void)toBack { [self.superview sendSubviewToBack:self]; }-(CGSize)trueSize { CGAffineTransform t = self.transform; self.transform = CGAffineTransformIdentity; CGSize size = self.frame.size; self.transform = t; return size; }@end UIView+Simple.hをPCHファイルなんかで全体に読み込まれるようにしておきます。 #import “UIView+Simple.h” そんでもって使い方。 例1.親Viewの中央に乗せる subview.center = view.o;[view addSubview:subview]; 例2.View1の右隣にマージン14pxでView2を設置する view2.frame = CGRectMake(view1.right + 14.0, view1.y, view2.width, view2.height); 例3.Viewを先頭に持ってくる [view toFront] などなどなどなど… (便利でしょ?) 他にも省略したいものがあればココにどんどん追加すればいいのでーす♪

View More

Manifest.lock: No such file or directoryとかPods-resources.sh: No such file or directoryとか出るとき 【Xcode】【Pod】

こんにちは。最近、起床時間が最大12時間ずれるあっきぃです。起きたら夜の7時だった時の絶望感はやみつきです。ぺろり。 さてさてiPhoneアプリを開発するためにXcodeちゃんでPodを使っているのですがこんなエラーが diff: /../Podfile.lock: No such file or directorydiff: /Manifest.lock: No such file or directoryerror: The sandbox is not in sync with the Podfile.lock. Run ‘pod install’ or update your CocoaPods installation. まぁよくある現象で、再installすれば直ることが多いみたいですが、それでも直らない方へ 1.Manifest.lock: No such file or directoryと出る場合 Configurationsの設定が「None」になってるカモ。 Project > Info > Configurationsのところを確認しましょう。 「None」になってたら「Pods」を選択しましょ。 そしたらこんなエラーが出たよという方 Pods/Pods-resources.sh: No such file or directory 2.Pods-resources.sh: No […]

View More

【Xcode】 Please verify that your device’s clock is properly set, and that your signing certificate is not expired. (0xE8008018).とか出たら。

Xcodeをビルドしたら Please verify that your device’s clock is properly set, and that your signing certificate is not expired. (0xE8008018). ってなエラーが。 おそらくアメリカ大陸の言語だと思われます。そして意味はおおよそ「デバイスの時間がずれているまたはプロビジョニングファイルの有効期限が切れている。」といったところでしょう。 デバイスの時間設定は間違っていないので、なんかそんなようなファイルの有効期限が切れてしまったのだと思います。 Xcode4,5の時はここらへんのエラーで大変時間をとられたのは、今となっては良い思い出です。そしてXcode6からは優秀でもろもろ勝手にやってくれます。すこし寂しいです。 1.Preferencesを選択 左上のメニューから「Preferences…」を選択 2.AccountsタブからView Details Accountsのタブから、「View Details…」を選択 3.更新マークを押す クルクルを押します。 これで直っちゃう(はず)。 便利な時代になったもんだ。

View More

Xcode6 PCHファイルがないので追加する

Xcode6にてiOS8に対応させようとしたらどうにもビルドが通らなくなり、結局プロジェクトを作り直すことに。するとなんとXcode6からはデフォルトで入っているPrefix.pchが無いことに気づく。 てなわけで追加してみます。 どこでも良いですが、昔は「Supporting Files」の中にあったのでこの位置に追加。 「PCH File」ってのがあるのでそれを選択 名前はプロジェクト名-Prefix.pchにすると落ち着くカモ。(別に何でもいいです。) あとはBuild SettingsからApple LLVM 6.0 – LanguageのPrefix Headerにパスを追加します。 普通に追加したならば「プロジェクト名/ファイル名.pch」となります。 これでばっちぐー♪

View More

Xcode6でもストーリーボードなしのEmpty Applicationから始めたい

Xcode6になったとたん新規作成時のEmpty Applicationがなくなってしまいました。Appleさん的にはストーリーボードを使ってもらいたいようです。 が、ストーリーボードを使うメリットが未だに理解できないので出来れば使いたくない。 ちょいちょい調べてみると流石我らのStackOverflow。同じように悩んでる方々がいました。コメントなんか見てみも分かりますが、ストーリーボード不使用派は結構いるみたいですね。ふんふん。⇒ ios – Xcode 6 – Template without Storyboards – Stack Overflow さてそのやり方 1.Single View Applicationを選択 2.Storyboardを消す Xibファイルも嫌いな方はそれも消しちまえ。 3.AppDelegateに見たことあるコードを書く rootViewControllerに自分で作ったやつ渡せばよろし – (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];        UIViewController *viewController = [[UIViewController alloc] init];        self.window.rootViewController = viewController;        [self.window makeKeyAndVisible];        return YES;} 4.Main Interfaceを空っぽにする Deployment Infoのとこです。 これでいつも通り開発できます♪ではでは♪

View More

「Manage iAd Network」ボタンが表示されない

iAdを設定しようと調べるとバイナリをアップロードした後に「Manage iAd Network」のボタンが表示されるんだよ! ってな情報ががちらほら出ててなるほど!と思ったんだけど一向にそのボタンが出現しない。 むむっと思ってiTunes Connectをよくよく見てみると なんかiAdについて書いてある…。 iAd App Network Configuration UpdateOnce you sign the iAd App Network Contract and integrate the iAd Framework in your app, all approved and Ready for Sale apps will be eligible to receive iAd ads. You no longer need to enable each app for iAd in the Manage Your […]

View More

Xcode5でiOS6.1のBaseSDKを使えるようにする

どうもこんにちは。先日「カイジの2部、3部」と「銀と金」の35巻分くらいを一気に読破したあっきぃ(@appstars_aki)です。 ざわ…ざわ… 今日はそんなカイジ好きかつXcodeを5.0にアップデートしたけどiOS7用にビルドする気なんかさらさらないぜ的な方のためのXcode5.0にiOS6.1のBaseSDKを入れようなお話です。 SDK単体ではダウンロードできないのでXcode4.6.3をこちらからダウンロードします。 すでに持っている人は不要です。 とりあえず今回はApplicationフォルダにXcode5.0が入っているのでXcode4.6.3はDesktopに置いてみました。(※つまり/Applications/Xcode.appがXcode5.0で~/Desktop/Xcode.appがXcode4.6.3となります。) あとはXcode5.0のSDKが入っているっぽいディレクトリにXcode4.6.3のSDKが入っているぽいディレクトリへのリンクを用意して上げるだけです。 Xcode5.0の中を見てみると… /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDks/iPhoneOS7.0.sdk これでOKかと思いきや出てこないのだ。ぬぬぬ。 どうしたもんかとその周辺を探すとversion.plistなるファイルを発見。 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/version.plist 中をのぞいてみるとこんな記述 <?xml version=”1.0″ encoding=”UTF-8″?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0″>        <dict>                <key>BuildVersion</key>                <string>668</string>                <key>CFBundleShortVersionString</key>                <string>7.0</string>                <key>ProductBuildVersion</key>                <string>11A465</string>                <key>ProjectName</key>                <string>iPhonePlatformSupport</string>                <key>SourceVersion</key>                <string>2036000000000000</string>        </dict></plist> どうみてもSDKの記述。ここにXcode4.6.3の方のversion.plistの記述を追加してみる。追記:dictはarrayタグで囲んでね。Qiitaより(2014-06-06 06:18) ~/Desktop/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/version.plist <?xml version=”1.0″ encoding=”UTF-8″?><!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”><plist version=”1.0″>        <array>                <dict>                        <key>BuildVersion</key>                        <string>668</string>                        <key>CFBundleShortVersionString</key>                        <string>7.0</string>                        <key>ProductBuildVersion</key>                        <string>11A465</string>                        <key>ProjectName</key>                        <string>iPhonePlatformSupport</string>                        <key>SourceVersion</key>                        <string>2036000000000000</string>                </dict>                <dict>                        <key>BuildVersion</key>                        <string>774</string>                        <key>CFBundleShortVersionString</key>                        <string>6.1</string>                        <key>ProductBuildVersion</key>                        <string>10B141</string>                        <key>ProjectName</key>                        <string>iPhonePlatformSupport</string>                        <key>SourceVersion</key>                        <string>1824000000000000</string>                </dict>        </array></plist> すると通りました♪ なんかもっと簡単な方法があるような気がするので気づいちゃった人はぜひ教えてくださいませっ ではでは♪

View More