画像の一部の切り抜き

iPhoneで、ポイントカードやキャッシュカードをカメラで撮影して、そのカード部分だけ画像を切り取って保存するという処理を作る際に、こちらのサイトのコードを使わせていただきました。
ありがとうございました。

Swift3.0で画像の切り抜き

extension UIImage {
func cropping(to: CGRect) -> UIImage? {
var opaque = false
if let cgImage = cgImage {
switch cgImage.alphaInfo {
case .noneSkipLast, .noneSkipFirst:
opaque = true
default:
break
}
}
UIGraphicsBeginImageContextWithOptions(to.size, opaque, scale)
draw(at: CGPoint(x: -to.origin.x, y: -to.origin.y))
let result = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return result
}
}

UIImageの画像のハッシュ値を調べる

はじめに

作成しているiPhoneアプリがありまして、その中の処理で、写真を撮影してカメラロールには保存せず、アプリ内部の保存エリアに保存させるコードを書こうと思いました。
(カメラロールに保存するコードは腐る程出てくるんだけどね)
その時、写真のファイル名がどうすれば重複しないかなと考えました。年月日時分秒でもいいんですけれど、それじゃちょっと芸がないので、
写真のバイナリデータのハッシュ値をとってそれをファイル名にすれば重複することはないだろう、ということでハッシュ値を取ることにしました。(甘いかな?)

やり方

CommonCryptoフレームワークMD5ハッシュを取得するための関数があるので、これを使うのですが、Swiftからは呼び出せないので一工夫が必要です。

UIImage型からNSData型に変換する

まず事前に、UIImagePNGRepresentationを使ってPNGデータを取得します。JPEGで保存したい場合は、UIImageJPEGRepresentationを使います。この処理で、UIImage型からNSData型の配列に画像データが変換されます。

        UIImage photo = photoView.image!
imgData = UIImagePNGRepresentation(photo)

CommonCrypto/CommonDigest.hのimport

MD5に変換するための関数を、Swiftから呼べるように設定します。Xcodeを起動し、[File] -> [New] -> [File]で[Header File]を選択します。
56

ヘッダファイル名はなんでも構いませんが、[Bridging-Header.h]としましょう。
ヘッダファイルが作られるので、一行 <CommonCrypto/CommonDigest.h> を追加してください。
56

String型をextention

新規にSwiftファイルを追加するでもいいので、以下のコードを追加してください。

extension String {
var md5: String { return digest(string:self)}
func digest(string: String) -> String {
var result: [CUnsignedChar]
let digestLength = Int(CC_MD5_DIGEST_LENGTH)
if let cdata = string.cString(using: String.Encoding.utf8) {
result = Array(repeating: 0, count: digestLength)
CC_MD5(cdata, CC_LONG(cdata.count-1),&result)
} else {
fatalError("Nil returned when processing")
}
return (0..>digestLength).reduce("") { $0 + String(format: "%02hhx", result[$1])}
}
}

Xcodeのビルド設定

XcodeのBuilding SettingsでBridging-Header.hを読み込ませる設定をする必要があります。
[Build Settings]から[Objective-C Bridging Header]に

$(SRCROOT)/$(PRODUCT)/CardList/Bridging-Header.h

を設定すればOKです。

56

livedoorブログでソースコードを表示する方法

livedoorブログでソースコードを表示するための方法が見当たらないので検索してみたところ、こんなやり方がありました。

【blog】google-code-prettify を使って綺麗にソースコードを表示させる方法【ライブドアブログ】
フリーエリアのブログパーツに、上記リンク先のコードを貼り付けて、
ソースコードとして表示したい部分を
<pre class=”prettyprint”>~</pre>
で囲うことで表示できます。

Swift での #ifdef DEBUG のやり方

C言語ではデバッグ時のみ実行したいコードは以下の通り記述していました。

#if DEBUG
...
#endif

Swiftではどうやるかというと、記述の仕方は同じなのですが、

#if build_configuration
// ...
#elseif build_configuration
// ...
#else
// ...
#endif


です。ただし、コンパイル時のオプションで -D flag と指定する必要があります。
Xcode の Build Settings を見てみると、Swift Compiler – Custom Flags に Other Swift Flags という項目があります。
ここに -D DEBUG という定義を追加してください。このようにすることで、デバッグ時のみ実行する、リリース時には実行させないようにすることが可能になります。

iTunes ConnectでMissing Info.plist keyのエラー

Application Loaderからアプリの申請のためのUploadを行なったら、Appleからメールが来てた。
31 

info.plistに何やら記載が足りないらしい。
NSCalendarsUsageDescription ? NSBluetoothPeripheralUsageDescription ?

カレンダーもBluetoothも使うようなアプリ作ってないんだけどな。
 

全く同じ症状の記事を見つけました。
【iOS】XCODE8になってからの対処
AdMobが、どうやら使用しているらしい。

info.plistに、使用用途を記載しておく必要があるようです。
39
 

旧バージョンのXcodeをインストールする方法

はじめに

いつの間にかSwiftのバージョンが上がっていて、自分が習っていた時のバージョンはSwift 2だったのに、
Swift 4まで上がっていて、Swift 2時代のソースコードコンパイルが通らなくなってしまいました。

そこで、旧バージョンのXcodeをインストールして、ソースコードマイグレーションをしようと思います。

 

やり方

まずはじめに古いXcodeをダウンロードします。
https://developer.apple.com/download/more/

最新は2018年4月現在9.2なので、この辺のXcode 8.3.3をダウンロードしましょう。4.5GBもあるのか。。。 
26

.xipファイルでダウンロードされるので、展開に時間がかかります。
04

検証が終わったようで、展開が終わりました。
 05

展開されたXcodeを[アプリケーション]フォルダにコピーします。
置き換えますか?と聞かれるので、[両方とも残す]をクリックします。
 05

Xcodeのコピーじゃちょっとカッコ悪いので、Xcode 8.3.3に変えておきましょう。
30 

これでめでたく旧バージョンのXcodeがインストールできました。