2014年5月31日土曜日

画像関係の用語の整理(UIImage、NSImage、CGImage、CGImageRef)



整理できてないけどね。

画像関係でいろいろなFW・クラスが登場するので軽く情報収集。
まあよくわかりませんな。iOSはほんと内部でFWがバラバラなのでわけわからん。
自分がよくわかってないだけで実は非常に合理的な設計だったりするんだろうか。




【UIImage】
 Framework /System/Library/Frameworks/UIKit.framework https://developer.apple.com/library/ios/documentation/uikit/reference/UIImage_Class/Reference/Reference.html
A UIImage object is a high-level way to display image data. Image objects are immutable, so you cannot change their properties after creation.

【NSImage】
 macで使うものでiOSでは使わないんじゃね?
Framework /System/Library/Frameworks/AppKit.framework
 The NSImage class is a high-level interface for manipulating image data. You use instances of this class to load existing images, create new images, and draw the resulting image data into your views. Although you use this class predominantly for image-related operations, the class itself knows little about the underlying image data. Instead, it works in conjunction with one or more image representation objects (subclasses of NSImageRep) to manage and render the image data. For the most part, these interactions are transparent. 
NSImageクラスはは画像データ操作の高度なインタフェースです。 このクラスのインスタンスを画像の読み込みや新規作成や描画結果のviewへの書き込みに使えます。 このクラスは画像に関わる操作に圧倒的ですが、画像データの基礎知識に乏しいです? サブクラスのNSImageRepあるからそっち使ってね。 イミフ。

【CGImage】
  Framework ApplicationServices/ApplicationServices.h https://developer.apple.com/library/ios/documentation/graphicsimaging/Reference/CGImage/Reference/reference.html
The CGImageRef opaque type represents bitmap images and bitmap image masks, based on sample data that you supply.
 CGImageRef 不透明型は あなたの提供した ビットマップ画像やビットマップ画像マスク を 表す CGImageはCGImageRefだよ、でいいのか

【CGImageRef】
An opaque type that encapsulates bitmap image information 
「ビットマップ画像情報を内包した不透明型です」
ヘッダで定義したフォーマットの型をOpaqueにして構造体定義を実装側によせると直しやすいよ!ということらしい
http://d.hatena.ne.jp/white_wheels/20110817/p3


後半に続く

2014年5月30日金曜日

緯度経度から地名を取得する

・・・でググってもMKReverseGeocoder使う方法ばっかり出て来て困った。
 
MKReverseGeocoderはdeprecated扱いで、
CoreLocationのCLGeocoderを使用すればよいみたい。
(MKReverseGeocoderはグーグルマップ使ってみたいですね)


        CLGeocoder *geocoder = [CLGeocoder new];

        [_geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
            if (error) {
                LOG_CURRENT_LINE(@"%@", error);
            } else {
                if (0 < [placemarks count]) {
                    
                    // ログ出力
                    CLPlacemark *p = [placemarks objectAtIndex:0];
                    
                    NSString *country = [p.addressDictionary objectForKey:@"Country"];
                    NSString *countryCode = [p.addressDictionary objectForKey:@"CountryCode"];
                    NSString *name = [p.addressDictionary objectForKey:@"Name"];
                    NSString *state = [p.addressDictionary objectForKey:@"State"];
                    NSString *street = [p.addressDictionary objectForKey:@"Street"];
                    NSString *thoroughfare = [p.addressDictionary objectForKey:@"Thoroughfare"];
                    
                    cellLabel.text = street;
                    
                }else{
                    
                    LOG_CURRENT_LINE(@"(取得できませんでした)");
                    cellLabel.text = @"(取得できませんでした)";
                }
            }
        }];

       

2014年5月29日木曜日

StoryBoardの警告「Unsupported Configuration: Prototype table cells must have reuse identifiers」

StoryBoardで3つのtableviewを持つ画面を設計したら警告出た。

「Unsupported Configuration: Prototype table cells must have reuse identifiers」

なにかというと、それぞれのtableViewCellにユニークなidentifierを設定していないため。

ちゃんと設定しなおせば消える。
間違ったままだと当然、cellが呼び出せないのでアプリ起動時にまっちろなセルが表示されることになる。

<参考>
Xcodo Unsupported Configuration…エラーの原因と解決方法

2014年5月28日水曜日

審査NG「10.6: Apple and our customers place a high value on simple, refined, creative, well thought through interfaces.」で食い下がった結果

2chBuzzってまとめブログリーダーの件なんですけど。

リジェクト理由が以下。
10.6: Apple and our customers place a high value on simple, refined, creative, well thought through interfaces. They take more work but are worth it. Apple sets a high bar. If your user interface is complex or less than very good it may be rejected Thank you for your reply.

なるほど分からん。のでResolution Centerで食い下がった結果。
(以下の自分の質問は中学英語で。)

自分)よく分からん。具体的によろしく。
林檎)Your app does not contain any native iOS features, rather, a collection of web views. 
   It maybe appropriate to add native iOS features to your app and resubmit a new binary.
   (WEB表示するだけのアプリとかあかんで)

自分)確認したいんだけど、アプリのコンセプトは問題ないよね?
   カテゴリ分けしてるし人気順にソートしてるし十分機能的で便利だよ。
林檎) We are not able provide feedback on app concepts or features
   (アプリのコンセプトに関しては回答不能やで)

自分) UIが悪いってこと?
林檎)It would be appropriate to remove all pornographic content from your app and resubmit a new binary.
   (エロ削除しろや)

最初っからそう言えよ・・・一年前は同様の指摘の場合、画面のSS添えてこのURLだめっすよみたいな具体的な指摘だったんだが。

案の定、審査担当者か審査基準が変わっているような。

2014年5月27日火曜日

丸いUIButton(UIView)を作成する

ボタンの枠の設定する方法。
枠ないのがiOS7の基本だけど、あったほうがわかりやすい場面も多い。はず。

正方形のボタンに対して、辺の半分の値をcornarRadiusに設定すると円にできる。


//角丸の半径を設定 
twitterButton.layer.cornerRadius = 20.0f

//枠線の色
twitterButton.layer.borderColor = [[UIColor whiteColor] CGColor];

//枠線の幅 
twitterButton.layer.borderWidth = 1.5f; 


<参考>
開発初心者の為のCALayerチュートリアル

2014年5月26日月曜日

ブロック構文のエラー『Incompatible block pointer types・・・』

ブロック構文の記述でエラーメッセージ。
・・・まあ、例によってコピペしてきたら動かなかったわけですけども。

Incompatible block pointer types initializing 'void (^__strong)(struct ALAssetsGroup *, BOOL *)' with an expression of type 'void (^)(ALAssetsGroup *__strong, BOOL *)'

型が不正、という指摘なのだが・・・
structを外してしまえばエラーは消えるけれど、それで正常に動くかはまた当然別問題で。

他の皆様の解決方法は、
http://stackoverflow.com/questions/6944033/incompatible-block-pointer-types-initializing-voidstruct-alassetsgroup-b

・・・やっぱstruct外しただけか。不安だなー。

2014年5月25日日曜日

Storyboardでnavigationをもつ画面のつなぎ方

久々に嵌った。Storyboard発案者は可及的しめやかに爆散すべき。

c(`Д´と⌒c)つ彡 ヤダヤダ

navigationをもつViewをStoryboardでデザインしていて、
(tableViewのセル選択で次のtableViewへ遷移)
つなぎ方誤ってエラーになった。

*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Push segues can only be used when the source controller is managed by an instance of UINavigationController.'

間違ってやったやり方はこう。
(tableViewの間にnavigation挟んでた)









んで、正しいやり方がこう。
(頭にnavigationを挿入)










こういう勘違いをするあたり、自分の公式リファレンスの読み込みの足らなさを自覚。
でも、動かなくなるようなデザインの仕方を許容しないようにしてほしい。Storyboard。

2014年5月24日土曜日

今更ながら、アプリ審査が厳しすぎると思う件

泣き言である。
今日現在、2件のアプリが初回の審査でリジェクトされてリリースできないでいる。

ひとつは、静音カメラの「SSS Cam」。現状のリジェクト理由は、

PLA 3.3.8

We found that your app auto-disables the shutter sound of the camera when a photo is taken, which does not comply with the iOS Developer Program License Agreement:

Section 3.3.8: Any form of user or device data collection, or image, picture or voice capture or recording (collectively "Recordings"), and any form of data, content or information collection, processing, maintenance, uploading, syncing, storage, transmission, sharing, disclosure or use performed by, through or in connection with Your Application must comply with all applicable privacy laws and regulations as well as any related Program Requirements, including but not limited to any notice or consent requirements. In particular, a reasonably conspicuous audio, visual or other indicator must be displayed to the user as part of the Application to indicate that a Recording is taking place.

Specifically, apps are not allowed to mute the camera shutter sounds via in app settings. This is only permissible via the iOS Settings or the slider on the side of the device.

要するに、「シャッター音は鳴らないとだめだよ。」「iOSの設定か端末のスイッチで無効にする以外だめだよ。」という。
・・・いや、他所のアプリで静音カメラなんぞ大量にあるじゃないか。


もうひとつは、2chまとめリーダーの「2chBuzz」。
一年前に作成したもののアプリ審査で12回程蹴られて一度諦めたが、
今月ダメ元で審査にアップロードしてみた。審査担当者とか審査基準変わってる可能性あるし。

で今回のリジェクト理由は、
 We found the following issues with the user interface of your app:

Did not include iOS features. For example, it would be appropriate to use native iOS buttons and iOS features other than just web views, Push Notifications, or sharing.

These examples identify types of issues discovered in your app but may not represent all such issues. It would be appropriate to thoroughly evaluate your app to address these types of issues.


・・・UIがヘボいということか?
前回12回とリジェクト理由変わってんじゃねーか。
(前回は、「いかがわしいサイトを含むな」「単なる固定RSSフィードリーダーはダメだ」など)


審査が厳しいのはまあいい。
ただ、「修正しても理由を変えて審査NG」「他所のアプリと同じ機能でも審査NG」は
本当にかんべんして欲しい。理不尽だ。

2014年5月23日金曜日

退職後の年金・健康保険手続きまとめ。

一応、独立(個人事業主でエンジニア)を目指し退職したので、
備忘も兼ねて、手続き関係軽くまとめ。

① 健康保険

国民健康保険に新たに加入するか、元の会社の健康保険を任意継続するか選べますが、
試算したところ金額変わらなかったのでとりあえず任意継続。
あとから国保にするのは簡単だけど、任意継続は今のタイミングでしかできないので
迷ったら任意継続しとくとよろしいそうな。

任意継続の申請を郵送すると、書留で新しい健康保険証と納付書が送られてくる。
初回の納付期限は発送から10日後くらいだった。
自分のような「任意継続したいんだけど退職翌日から長期旅行しちゃうぜ」って人は
申請を郵送するタイミングを考慮してないと、書留が受け取れなくてまずい。

② 国民年金

居住市の国民年金課で、厚生年金から切り替え(というか国民年金への加入)の手続き。
印鑑と年金手帳と離職票持っていく。
離職票じゃなくて「退職日時が分かる書類」ならなんでもいいみたいなんだけど
(自分も会社発行の退職証明書を持っていった。コピーだけ提出した。)
「離職票持ってきたら、無職期間の納付免除とか後納とかできる場合があります」
と教えてくれた。
・・・けど持って行ってなかったのと、納付記録ややこしくなると信用できないなんかアレなので普通に納付。損したかも。
実際の納付に関しては後日納付書郵送されるとのこと。引き落としにしよう。

あと、過去に年金の未納分がある(前々職に就く前)のだけれど、年金事務所に後納申し込みを郵送した。
けど、市の窓口でもできたかもな。二度手間だったか。


あとは、税務署への開業届の提出だけか。
無職といえど、案外忙しいもんだ。

2014年5月22日木曜日

MacBook Proを外部ディスプレイのみで使用する(クラムシェルモード)

MacBook Pro、15インチあるとはいえ開発環境を使うには広いディプレイのほうがいいですよね。

で外部ディスプレイつなぐわけですが、
そのままデュアルでも使えますが、大きさ違うのも使いづらいので
ノートのディスプレイを無効にして外部のみ使用したいと思います。

方法としては「MacBookのディスプレイ閉じる」だけなんですけど、
そうするとキーボード側から放熱できないので嫌だ。と。
んじゃあ、「ディスプレイ閉じてると認識させる」ようにする方法ですが、
パームレストに磁石おくといいようです。

置き場所は機種によって違うそうな。
MacBook Pro 2008 late では以下のとおりです。
(見づらいですけど。)


2014年5月21日水曜日

自作アプリ「半角カタカナ」を更新しました。





<<紹介ページ>>
http://nadegiri.blogspot.jp/p/blog-page.html


2年前のGWにつくったやつですけどね。
久々に更新しました。今更iOS7対応など。

やはり無料且つ広告なしなだけあって好評です。
大したものじゃないんですが需要あるんですねー。33,000 DLくらいですよ現在。

てか、更新内容に「無職になったよ☆(ゝω・)vキャピ」て書いたら
 『お仕事探し頑張って!!』『良い仕事見つかるといいですね!』とか
星5評価いっぱいついてて・・・つらい!

ありがとうございます、お陰で巴術士の仕事見つかりました。

・・・W杯終わるまでは仕事しないんじゃないかな。

2014年5月20日火曜日

文字列定数はどこに定義すべきか?

最初の頃はかなり悩んだんですけど。文字列定数を定義する場所。
オレオレ開発方式で見出した方法は以下の通り。

① 画面の表示文言・メッセージ文言などUI系
  → Localizable.strings に定義。
    ローカライズすることを前提に最初っからここに作成する。
    これはもう一択かな。

② ハッシュのキーなどにする定数など
  → クラス内で使うならクラスの先頭に適当。
    最初は抵抗あったけど、#defineで。
    constつかう場合と本当はどっちがいいか検討したい。
    でもAppleの組み込みクラスでも#defineガンガン使ってるからいいんでねえかな。

③ 自作Utilクラスなど、インポートさせた先で参照したい定数など
  → 「extern NSString* const」を使用。
    インポートされた場合、インポートした先から参照可能になる。
    ヘッダと本体でそれぞれ定義いるから面倒だけど。

//hoge.h

extern NSString* const ext_str;


//hoge.m

NSString* const ext_str = @"hoge";



こんなところだろうか。

2014年5月19日月曜日

iPhoneシミュレータのスクリーンショットの撮り方

例によってAppStoreにアップロードするようのSSの撮り方なんですけど。

昨日は急いでたのでちゃんと調べないで、適当に撮って枠切り詰めてサイズ合わせてたんですけど手間すぎ。
で、正しい(?)やり方です。

1.ツールいらないやり方

  慣れたらすぐできるからそんな手間じゃない。
  ① ctrl + cmd + c で撮影(クリップボードへ保存)
  ② 「プレビュー」を起動してctrl + n で「クリップボードから新規作成」を実行
  ③ 適宜保存

2.ツール使うやり方

  iOS-Simulator Cropper
  ステータスバーをトリムするか、とか
  シミュレータの皮の部分は要るか、とかいろいろ設定可能。


今後はCropper使おう。
昔ちょっと使ってたけど、OS入れなおしてから入れるの忘れてたZE。


2014年5月18日日曜日

UIColor生成ツール「UIcolor Code Generator」







UIColorをピッカーで生成するツール。

UIcolor Code Generator

UIColor * color = [UIColor colorWithRed:0/255.0f green:66/255.0f blue:153/255.0f alpha:1.0f]; 



2014年5月17日土曜日

appname-Prefix.pchに定義しておくと便利なデバッグマクロ

デバッグのログ関数とかいちいち書くの面倒なので。
appname-Prefix.pchにいつも最初に定義しておくと楽です。

//ログ 関数名・行数の表示
#ifdef DEBUG
#   define LOG_CURRENT_LINE(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#   define LOG_CURRENT_LINE(...)
#endif

//ログ 変数の表示
#ifdef DEBUG
#   define LOG_V(var) NSLog(@"%s=%@", #var, var)
#   define LOG_I(var) NSLog(@"%s=%d", #var, var)
#   define LOG_F(var) NSLog(@"%s=%f", #var, var)
#   define LOG_B(var) NSLog(@"%s=%@", #var, var ? @"YES":@"NO" )
#else
#   define LOG_V(var)
#   define LOG_I(var)
#   define LOG_F(var)
#   define LOG_B(var)
#endif

iPhoneシミュレーターでの日本語フォントの設定

Xcode付属のiPhoneシミュレータでAppStore用のSS撮ったりするわけですけど、
なんかフォントおかしいわけですよ。

それの直し方なんですけど。
シミュレータの言語設定で、デフォルト英語のところを日本語に変更します。
下記SS参考に順に選択です。
てか英語設定でも自動できれいなフォントにしてくれんかね。




2014年5月16日金曜日

UITabBarItemのTintColorを変更する

調べるにの案外時間かかってしまった。
UITabBarItemのTintではなく、UITabBarのselectedImageTintだそうだ。
うん、わからん。

[[UITabBar appearance] setSelectedImageTintColor:[UIColor redColor]];



2014年5月15日木曜日

UITexeViewで入力文字数を取得する

デリゲートの設定をお忘れなく。

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range  replacementText:(NSString *)text {

    countLabel.text = [NSString stringWithFormat:@"%d文字", (int)textView.text.length];
    
    return YES;
}





最初に半角カタカナ変換アプリ作った時、デリゲートを理解していなくてこれすら実装できなかったという・・・。

2014年5月14日水曜日

” valid provisioning profile for this executable was not found.”のエラー

実機実行時に
” valid provisioning profile for this executable was not found.”
とエラーになってしまい起動できなくなった。

文字通りprovisioningに設定するものが間違っているとの指摘だけど、
見なおしても何もおかしくない。はて。

という場合、Run時に適用するschemeで、標準のDebugではなくReleaseを適用するようになっていたため、
確認すべきところを間違っていた・・・。というオチだった。

Releaseで動作確認して、審査でprovisioning変更して、それっきりだったからなー。

2014年5月13日火曜日

iOSアプリの多言語対応

多言語対応をする場合、効率的な作業手順は

① 文字列定数のLocalizableファイルへの切り出し
② プロジェクト設定から、ローカライズ
③ Localizableファイル、xibファイルの各言語毎の翻訳(文字列の置き換え)
 
実際やってみたところ、とにかく弄るファイルが増えるので、
・「xibファイルが増えるととにかく面倒なのでできるだけ翻訳対象から外す」

・「できるだけアプリが完成に近づいてから多言語対応する」
ってのがポイントだろうか。

(参考)
Xcode 5でアプリを多言語対応するまでの全スクリーンショット

各環境で試験するには、
多言語対応した iPhoneアプリを各言語環境で簡単にデバッグする方法

2014年5月12日月曜日

AVCaptureDeviceを使用したカメラアプリでのズームの実装

標準のカメラアプリ同様、スライダーでのズームを実装した。

- (IBAction)setZoom:(id)sender{
   
    AVCaptureDevice* videoCaptureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
   
    NSError* error = nil;
    if ([videoCaptureDevice lockForConfiguration:&error]) {
       
        [videoCaptureDevice rampToVideoZoomFactor:_slider.value    //UISlider
                                                                 withRate:5.0];               //ズーム速度
       
        [videoCaptureDevice unlockForConfiguration];
    } else {
        NSLog(@"%s|[ERROR] %@", __PRETTY_FUNCTION__, error);
    }
}

2014年5月11日日曜日

iOS端末上に隠しファイルを保存する(Objective-C)

「Objective-C」「隠しファイル」で検索しても全然ヒットしなかったのでタイトルにがっつりキーワードを埋めていくスタイル。

結局やり方は簡単で、Macと同じなんだけれど。

ファイル名の先頭に『.』(ドット)を付与することで、隠しファイルにできる。

開発中のカメラアプリで、設定ファイルのplistをDocumentフォルダ下に保存しているのだけれど、
同じフォルダに撮影した画像を保存する場合がある(ユーザーが覗く可能性がある)ため、
設定ファイルを誤って消されたり壊されたりされないために設定した。

iExplorerで確認した限り、うまくいっているようだ。
また、MacにDocumentフォルダを移動してきても、隠しファイルになっていた(そりゃそうだ)

2014年5月10日土曜日

iOSデバイスの本体の向きの取得、画像ファイルへの設定方法

カメラアプリを作成していて、やたらめったら嵌ったためまとめ。
縦向き・横向きでもきちんと本体向きを維持して画像を保存したかったが難儀した。
デバイスの回転がロックされている場合、簡単には向きが取得できなかった。

・・・なんかデバイスの向きとUIの向きとカメラの向き別らしいんすよ。

デバイスの向きの取得方法

案① 普通にデバイス情報から取得

※回転ロック時は検知できない
   デバイスの向きの設定と取得の方法

案② Notificationを使用して検知・通知

※回転ロック時は検知できない
   iPhone, iPadの画面の向きを検出する方法まとめ
   UIDeviceOrientationからAVCaptureVideoOrientationを決める

案③ モーションセンサーを使って取得する

MotionOrientation
  多分これが一番確実だと思います(棒
  本体の回転角度からどの向きになっているか取得するライブラリ。
  Apache Licence2.0だそうです。
  実際に取り込んでみて、回転ロック時・非ロック時に期待の挙動となることを確認できました。
  

画像ファイルへの設定方法

以下を参考に、Exif情報に向きを付与します。
iPhoneやiPadで撮影した画像を他のデバイスで見ると自動で回転してしまう場合の対処法



Exif情報の扱いは過去記事参照で。

switch (orientation) {
        case UIDeviceOrientationPortrait:
            LOG_I(UIDeviceOrientationPortrait);
            [metadataAsMutable setObject:[NSNumber numberWithInt:1]
                                  forKey:(NSString *)kCGImagePropertyOrientation];
            break;
        case UIDeviceOrientationPortraitUpsideDown:
            LOG_I(UIDeviceOrientationPortraitUpsideDown);
            [metadataAsMutable setObject:[NSNumber numberWithInt:3]
                                  forKey:(NSString *)kCGImagePropertyOrientation];
            break;
        case UIDeviceOrientationLandscapeLeft:
            LOG_I(UIDeviceOrientationLandscapeLeft);
            [metadataAsMutable setObject:[NSNumber numberWithInt:8]
                                  forKey:(NSString *)kCGImagePropertyOrientation];
            break;
        case UIDeviceOrientationLandscapeRight:
            LOG_I(UIDeviceOrientationLandscapeRight);
            [metadataAsMutable setObject:[NSNumber numberWithInt:6]
                                  forKey:(NSString *)kCGImagePropertyOrientation];
            break;
        default:
            LOG_I(orientation);
            break;
    }




2014年5月9日金曜日

Bloggerでラベルの名称を一括修正する

ラベルって結構記事書くときに適当に設定するので、
他の記事と整合性とれなくなる場合がある。大文字小文字とかね。

Bloggerの場合、ラベルを一括修正する機能はないので、

① 修正したいラベルで絞り込み
② 修正後のラベルを付与
③ 修正したいラベルを削除

というやり方で変更する。
具体的に直したラベルは、

objective-c → Objective-C
ruby → Ruby
mac → Mac
iOS7 → iOSに統一

などなど。というか、最初から正式な綴り使わないとだめだよな。
素人じゃないんだから。

参考
Blogger で投稿のラベルを一括削除・一括変更する方法

2014年5月8日木曜日

「Resolve Auto Layout Issues」のメニューに何も表示されない場合

constraintsを設定していないViewに対して新たに設定する場合、
メニューの「Resolve Auto Layout Issues」からAdd missing constraintsを選択すると設定できる。

けれど無効になってしまっていて選択できない。はて。

で試行錯誤した結果、「Use Auto Layout」を外してしまっていたことを思い出した。
アホす(´・ω・`)


constraintsを使用した場合、自動生成された制約の一部が不正で、起動直後に即死する不具合があったため、OFFにしていたのを忘れていた。
残念すぎる。

2014年5月7日水曜日

実行直後に「Unable to simultaneously satisfy constraints.」のエラーが発生

「Add missing constraints」を使ってconstraintsを自動的に生成した場合に、
起動直後に即死するケースが発生。おいおい。 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    
    self.window.rootViewController = self.viewController;    //ここで落ちる
    [self.window makeKeyAndVisible];
    return YES;
}

でもご丁寧にエラーログに対処法が表示されている。

    Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want.
    Try this:
    (1) look at each constraint and try to figure out which you don't expect;
    (2) find the code that added the unwanted constraint or constraints and fix it.
        (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand,
        refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)

・・・不正なconstraintsが設定されているから直してね!みたいな感じか。
生成したのお前だろ。

今回の場合、iPhone5用の画面サイズで生成したconstraintsがiPhone4で実機実行した際に整合性がとれなくなったらしい。
ので縦幅に関するconstraintsを手動で削除・作りなおした。

2014年5月6日火曜日

Macのキーボードショートカットでメニューを選択するには

OS X のキーボードショートカットより、

マウスやトラックパッドを使わずにメニューバーのメニューを操作することができます。
メニューバーにフォーカスを置くには、「control + F2」(ポータブルのキーボードでは「fn + control + F2」) を押します。

・・・だそうな。
カーソル当てて選択しようとすると、全画面の場合なんかメニューバーがアニメーションして触りづらいので、覚えておいたほうが便利そうな。

2014年5月5日月曜日

撮影して保存した画像が「モーメント」に表示されない

撮影した画像が標準の写真アプリの「モーメント」タブに表示されない(場合がある)ようだ。
「アルバム」タブのカメラロールには表示されている。

 散々悩んだ末に、「Exif情報の日付のフォーマット」に問題があることまではつきとめた。
西暦がダメなのか曜日がダメなのかは検証していない。
もう知らん。不具合票切って3分後に解決した。悲c。

-(NSDictionary *)getExifDataDic{
    
    NSMutableDictionary *EXIFDic;
    
    if(!EXIFDic) EXIFDic = [NSMutableDictionary dictionary];
    
    //撮影日時の更新
    NSDateFormatter* form = [NSDateFormatter new];

    //西暦 年月日 曜日 時分秒 だとダメな場合がある?

    //[form setDateFormat:@"G yyyy/MM/dd(EEE) K:mm:ss"];
    // 年月日  時分秒 だとOK

    [form setDateFormat:@"yyyy/MM/dd K:mm:ss"];
    NSString* str = [form stringFromDate:[NSDate date]];
    
    [EXIFDic setObject:str
                forKey:(NSString*)kCGImagePropertyExifDateTimeOriginal];
    [EXIFDic setObject:str
                forKey:(NSString*)kCGImagePropertyExifDateTimeDigitized];
    
    return EXIFDic;
}


2014年5月4日日曜日

DCIMフォルダとは

やる気ねぇわー。

DCIMとは、『Digital Camera Images』のことだそうで。
iPhoneとかデジカメとか必ずメモリ内にその名前のフォルダに画像入ってるよね。



2014年5月3日土曜日

UIViewのレイアウトで「The selected views have no constraints.」となった場合の対応

UIViewをデザイナで弄る際に、なぜかConstraintsが存在しない。

インスペクタには代わりに「The selected views have no constraints.・・・」などと表示されている。

そういう場合、手動で追加する必要がある。
なんで失われてしまっているんだろうか・・・。

Editor → Resolve Auto Layout Issues → Add missing constraints

2014年5月2日金曜日

UITableViewのcellに追加したUIImageViewが削除できなくなった

iOS7対応してなかったものを未だに直していたんですが。

「UITableViewCellに描画した画像が、cellの再利用時に残ってしまう」
という事象が発生。

iOS6時点では、再利用時にUIImageViewをsubviewsから取得してremoveしていたけど、
iOS7 では UITableViewCell の subviews階層が変更されている
ために、その処理をすり抜けてしまっていた。

当初、「cellが再描画されてない」のを疑ったので、↓あたりを参考にデタラメに試してた。
やっぱ合理的に検証しないとダメだな。

setNeedsLayout

reloadData

2014年5月1日木曜日

アプリ申請時のValidateで「Invalid image Path 〜」のエラー





リリースしようとしてArchiveしてValidateしたらエラーもさもさ。
だからよー、こういうのコンパイルした時に教えろっつってんだろーがよー。
 
Invalid image Path-no image found at the path referenced under key 'CFBundleIcons':'xxxxxxxxxxxxx.png'


解決方法は、info.plistのファイル名を合わせること。
プロジェクトに画像を追加した際に自動的に設定されている項目のようだけれど
なんでか古いファイル名が残ったりする。

大文字・小文字注意。