iphoneアプリ 沖縄の魚図鑑 でハマったところ

以前リリースしていたアプリがAppleのXcodeのバージョンアップでObjective-CのClassが非推奨となり使えなくなってしまったので作り変えることになってしまいました。 作り変えるにあたって、主流がswiftとなってきているので、私のアプリもswiftで全面的に作り変えることにしました。 Apple Developerからsampleをダウンロードして、それをベースに作り変えていきました。 いろいろハマったところがありましたので、みなさんの参考になる点があればと思って恥を忍んで掲載します。

使用したバージョン
Xcode version 12.5.1
swift version 5.0

< let products = [Product(キー項目10項目)]は1233種類作成できなかったこと >
AppDelegate.swiftファイルに定義して読み込むのですが、テストデータで20種類くらい作成した時には順調だったのに、本番データを読み込ませようとすると、indexing.....と固まってしまって再起動になります。仕方がないので5項目に減らしてCSVファイルを別に作成して必要な個所で読み込ませて使うようにしました。パソコンのメモリーのサイズの問題なのか、システムの制限なのか不明です。

< Storyboardでは機種別に画像とLavelの配置が指定できなかったこと >
機種別にvary for Traitsで指定できると思っていろんなところに制約を入れたり外したりして設定するのですが、縦から横にしたり、機種を変えたりするとうまくできません。しかたがないので、機種別の画面サイズやツールバー、メニューバーの高さなどを考えて swiftファイルで細かく指定しました。Storyboardでなぜレイアウトが崩れるのか謎です。

< アプリ名を多言語対応に指定できなかったこと >
アプリの内容は多言語対応にできたのですが、インストールしたアイコンのアプリ名も多言語対応にしようとしました。Info.plistを多言語対応にしてもできなかったので、一度削除して以前のInfo.plistと入れ替えてもうまくゆきませんでした。調べなおすと、InfoPlist.stringというファイルを作成しないと変わらないと仕様変更になっていました。どんどん仕様が変わってわけがわかりません。

< アプリ名をAppleStoreにUpできなかったこと >
Info.plistを一度削除したために、AppleStoreにUpするときにエラーが出てしまいました。Archiveをして、Validate Appをして問題がないのにDistribute Appの途中でerrorになるので、最初はprovisioning file が正しく設定できていなのだろうと何種類も何回も作成し直しました。それでもだめだったので調べなおすとTransporterを使うとうまくゆくみたいなことがあったので、試しに使うと一度はエラーがあったのですが、それを直すとすんなりとUpできました。X-codeではエラーメッセージがなかったのでどうしようもなかったのですが、TransporterでUpするとAppStoreからエラーメッセージと具体的な修正方法が送り返されてきて、初めてInfo.plistを修正しないといけないことがわかりました。X-Codeでもこれくらいしてくれてもいいのに・・・

< UIPinchGestureRecognizerとUIPanGestureRecognizerで画像を拡大した状態で移動することができなかったこと >
StoryboardでLibraryからPinch Gesture Recognizer とPan Gesture RecognizerをViewに登録して、gazo_meiのImageViewのinteractionをUser Interaction EnabledとMultiple Touchにチェックをいれて、swiftファイルにActionの関連付けをしました。CGAffineTransformでそれぞれの動作はできるのですが、片方を使ってもう一方を使うと画像の位置もサイズも初期状態からスタートしてしまうのです。そこで、思った通りの動きをするswiftファイルを試行錯誤で作り上げました。若干のコメントを入れましたので参考になれば幸いです。


// 変数はCGFloatです。CGPointはつかいません。
var hajime_x: CGFloat! //画面に指を置いたときの画像のx座標
var hajime_y: CGFloat! //画面に指を置いたときの画像のy座標
var hajime_width: CGFloat! //画面に指を置いたときの画像の横幅
var hajime_heigit: CGFloat! //画面に指を置いたときの画像の高さ
// 関連付けするとこの関数が作成されます。この関数の中にプログラムしてゆきます。
  @IBAction func PinchView(_ sender: UIPinchGestureRecognizer) {
// 図形をアフィン変換する関数です。scaleは指を動かした割合です。1から始まって、拡大は1より大きく、縮小は小さくなります。
gazo_mei.transform = CGAffineTransform(scaleX: sender.scale,y: sender.scale)
// 指を動かし始めたときと動かし終わった後の設定をします。
switch sender.state {
case .began:
if (hajime_x == nil){ // 画面が表示されたときには変数に値が入っていないので値をセットします。
hajime_x = gazo_mei.frame.origin.x
hajime_y = gazo_mei.frame.origin.y
hajime_width = gazo_mei.bounds.width
hajime_heigit = gazo_mei.bounds.height
}
 gazo_mei.frame = CGRect.init(x: hajime_x, y: hajime_y, width: hajime_width, height: hajime_heigit)
case .ended:
hajime_x = hajime_x - hajime_width*(sender.scale-1)/2 // ここがミソ。拡大・縮小は1が最初なので変化は1を引きます。x座標は拡大すると左に動きますので引かなければなりません。UIPinchGestureは中央から拡大・縮小するので変化の量は幅の1/2になります
hajime_y = hajime_y - hajime_heigit*(sender.scale-1)/2
hajime_width = hajime_width * sender.scale
hajime_heigit = hajime_heigit * sender.scale
default:
break //defaultでなにも処理しないときのおまじないです。
}
}

@IBAction func PanView(_ sender: UIPanGestureRecognizer) {
gazo_mei.transform = CGAffineTransform(translationX: sender.translation(in: gazo_mei).x, y: sender.translation(in: gazo_mei).y)
switch sender.state {
case .began:
if (hajime_x == nil){
hajime_x = gazo_mei.frame.origin.x
hajime_y = gazo_mei.frame.origin.y
hajime_width = gazo_mei.bounds.width
hajime_heigit = gazo_mei.bounds.height
}
gazo_mei.frame = CGRect.init(x: hajime_x, y: hajime_y, width: hajime_width, height: hajime_heigit)
case .ended:
// UIPangestureはsender.translaitonで変化量がわかりますのでありがたいです。画像サイズはかわらないのでそのままです。
hajime_x = hajime_x + sender.translation(in: gazo_mei).x
hajime_y = hajime_y + sender.translation(in: gazo_mei).y
hajime_width = gazo_mei.bounds.width
hajime_heigit = gazo_mei.bounds.height
default:
break
}
}


お問い合わせやご質問はこちらへお願いします
info@okinawa-fishes.sakura.ne.jp
go_home