投稿

移行のおしらせ

 最近の投稿は https://zenn.dev/samekard_dev https://qiita.com/samekard_dev で行っております。

productViewControllerDidFinishはiOS13で挙動がちょっと違う。

func productViewControllerDidFinish(_ viewController: SKStoreProductViewController) { viewController.dismiss(animated: true, completion: nil) } というメソッドはiOS13で挙動がすこし変わっていた。上の書き方が一般的でこの書き方をしていれば問題ないと思われる。animatedやcompletionは状況に応じた値にすればいい。 ただ、次のような状況で別の記述になっていたらiOS13でおかしくなった。 dismissを「(自分の上に)表示しているViewControllerを消す」という意味ととらえた場合、つまりdismissを実行したViewControllerが消えるのではなく、子ViewControllerが消えるという解釈をした場合、 AがBを表示している状況で、Aがdelegateになっていれば、Bを消すときに func productViewControllerDidFinish(_ viewController: SKStoreProductViewController) { dismiss(animated: true, completion: nil) } という書き方になる。 しかしこの書き方ではiOS13ではA自身も消えてしまう。 dismissは子を消すという解釈は間違っていない気がするが。 dismissの挙動で何か情報を知っている人は教えていただきたい。dismissは自分が閉じるのか子が閉じるのか。

いまはCarplayアプリ開発の承諾は申込みするだけで出来る

Carplayアプリ開発の承諾の流れについて 今は申込みするだけで承諾されるそうです。 1.開発者が申し込み https://developer.apple.com/contact/carplay/ 2.Appleによる承諾 昔はもう少し手間がかかりました。 1.開発者が申し込み 2.Appleから契約書の送付(Eメール) 3.開発者が契約書に入力してAppleに送る 4.Appleによる承諾 私の場合、昔に申し込んで、昔の手順の1と2が行われた後、契約書の送付をしばらくしていませんでした。そのうちやり方が変わって、いざ契約書を送っても、何も反応がありません。改めて申し込みしたら翌日くらいに承諾されました。

Mac Book ProでWifi機能がトラブル

イメージ
Mac Book Pro 13インチ 2015をMajaveにあげてから、Wi2premium_clubの店でWi2 ConnectというWifi接続ソフトを立ち上げたときにレインボーカーソルがずっと出っぱなしという状況になりました。Wi2 Connectを強制停止させると、今度はWifi機能が壊れた状態になりました。「ハードウェアなし」という状況です。 ちなみに、Wi2 ConnectソフトはMojaveに対応したバージョンが出ているそうですが、私はそれを知らなかったので、いくらか古いバージョンを使用しておりました。 BootcampでWindows10を立ち上げると、そっちからは正常にWifiが使えたので希望はあるのかなと思い、根気よく取り組みました。 また、電源ON時にcmd+Rを行う簡易macOS(?)を立ち上げたときにも正常にWifiが使えました。 NVRAM のリセットを行う https://support.apple.com/ja-jp/HT204063 →だめ SMC (システム管理コントローラ) をリセットを行う https://support.apple.com/ja-jp/HT201295 →だめ OS上書きインストール →だめ OSを消去してから、OSインストール →成功 OSを一旦消去してからのOS再インストールで正常になったのでmacOS内部の何かが壊れたんだと思います。

2017年(平成29年)告示で2020年(平成?32年)4月1日から施行の小学校学習指導要領における学年別漢字配当表をユニコードスカラ順に並べたもの

小学校で習う漢字をユニコードスカラ値順に並べたいことってありますよね。現在は新課程に移行している段階(つじつまを合わせるために学年によっては新課程)なので新課程用のやつを作ってみました。 ○ ○ ○ ○ ○ ○...形式 ○,○,○,○,○,○...形式 "○","○","○","○","○","○"...形式 の3パターンで表記します。 ○ ○ ○ ○ ○ ○...形式 //一年 一 七 三 上 下 中 九 二 五 人 休 先 入 八 六 円 出 力 十 千 口 右 名 四 土 夕 大 天 女 子 字 学 小 山 川 左 年 手 文 日 早 月 木 本 村 林 校 森 正 気 水 火 犬 玉 王 生 田 男 町 白 百 目 石 空 立 竹 糸 耳 花 草 虫 見 貝 赤 足 車 金 雨 青 音 //二年 万 丸 交 京 今 会 体 何 作 元 兄 光 公 内 冬 刀 分 切 前 北 午 半 南 原 友 古 台 合 同 回 図 国 園 地 場 声 売 夏 外 多 夜 太 妹 姉 室 家 寺 少 岩 工 市 帰 広 店 弓 引 弟 弱 強 当 形 後 心 思 戸 才 教 数 新 方 明 星 春 昼 時 晴 曜 書 朝 来 東 楽 歌 止 歩 母 毎 毛 池 汽 活 海 点 父 牛 理 用 画 番 直 矢 知 社 秋 科 答 算 米 紙 細 組 絵 線 羽 考 聞 肉 自 船 色 茶 行 西 親 角 言 計 記 話 語 読 谷 買 走 近 通 週 道 遠 里 野 長 門 間 雪 雲 電 頭 顔 風 食 首 馬 高 魚 鳥 鳴 麦 黄 黒 //三年 丁 世 両 主 乗 予 事 仕 他 代 住 使 係 倍 全 具 写 列 助 勉 動 勝 化 区 医 去 反 取 受 号 向 君 味 命 和 品 員 商 問 坂 央 始 委 守 安 定 実 客 宮 宿 寒 対 局 屋 岸 島 州 帳 平 幸 度 庫 庭 式 役 待 急 息 悪 悲 想 意 感 所 打 投 拾 持 指 放 整 旅 族 昔 昭 暑 暗 曲 有 服 期 板 柱 根 植 業 様 横 橋 次 歯 死 氷 決 油 波 注 泳 洋 流 消 深 温 港 湖 湯 漢 炭 物 球 ...

キーボードの出入りに合わせる自前アニメーション処理は不要

UITextViewなどがファーストレスポンダになったときにキーボードが出てきて、それと同時に画面上のUIパーツもキーボードで隠れないように上に移動させることがよくあります。 キーボードの動きとUIパーツの動きのタイミングを合わせると見た目がシンプルになります。このUIパーツのアニメーションを自分で書くのではなく、OSに任せることが出来ます。 やり方 keyboardWillShowNotificationを受けたときに走らせるメソッドで、動かすUIパーツのframeやcenterの情報を書きます。あとは自動でアニメーションを行ってくれます。 シミュレーションで確認してみると、これが出来るのはiOS10からのようです。 自動でやってくれるのはUIパーツのframeの設定だけでなく、UITextViewの大きさを変更したときにカーソルが表示領域に入るようにスクロールオフセットの値を調整するのもやってくれるようです。 キーボードが出てくるときと同様にキーボードがしまわれるときは keyboardWillHideNotification を使います。 いたれりつくせりですね。 https://stackoverflow.com/questions/39292796/why-is-a-uiview-whose-frame-i-change-after-receiving-a-uikeyboardwillshownotific https://stackoverflow.com/questions/35914577/uikeyboardwillshownotification-animation https://stackoverflow.com/questions/39292796/why-is-a-uiview-whose-frame-i-change-after-receiving-a-uikeyboardwillshownotific https://medium.com/@shenghuawu/observe-ios-keyboard-notifications-a49323813656

UIViewを角丸にしようとしてもdraw(_ rect: CGRect)をオーバーライドしたら四角になる

Xcode 10.1 Swift 4.2 UIViewの角丸は class MyView: UIView { init() { super.init(frame: .zero) self.backgroundColor = UIColor.white self.layer.cornerRadius = 10.0 } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } } とすると出来る。 しかし次のように override func draw(_ rect: CGRect) を書いてしまうとダメになる。 class MyView: UIView { init() { super.init(frame: .zero) self.backgroundColor = UIColor.white self.layer.cornerRadius = 10.0 } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func draw(_ rect: CGRect) { super.draw(rect) } } この場合、self.clipsToBounds = trueをinit()などに書いてやると丸く収まる。 しかし、viewにシャドウを付ける場合はself.clipsToBounds = trueによってシャドウが消える。角丸にしてシャドウをつけるのはよくあるので困る。

MPMusicPlayerControllerのappendQueueDescriptor

MPMusicPlayerControllerのappendQueueDescriptorは仕様上はiOS10.3からだが、iOS10.3ではうまく機能しない。iOS11以降はOK.。 // Adds the contents of the queue descriptor to the end of the queue - (void)appendQueueDescriptor:(MPMusicPlayerQueueDescriptor *)descriptor MP_API(ios(10.3));

Validation出来ない症状

イメージ
Xcode 9にしてから何かと不便が多い。 今度はアプリをAppleに送る前のValidationが出来ない症状になった。Uploadも無理。 No accounts with iTunes Connect access have been found for アカウント名(チーム名?) iTunes Connect access is required for Apple Store distribution. No iTunes Connect access for the team. 少し古いプロジェクトは大丈夫だったのにちょっとソースを変更したらいきなりこの症状である。 対策(と言えるのか?) 大丈夫だったプロジェクトでvalidationを行うとうまくいった。 その後、問題のあるプロジェクトでvalidationを行うと今度はうまくいった。

Xcode 9でInstrumentsが実行できない不具合

イメージ
Xcode 9からの不具合なのかInstrumentsが実行できない状態になりました。 録画ボタンのような赤丸をクリックして開始しようとすると Permission to debug xxx.xxxx.xxx was denied. と表示されて開始しません。 以下の作業をしたら治りました。XcodeのPreferenceで - Preference -> Locations -> Command Line ToolsをXcode 8.3.3に切り替え - Instruments立ち上げ - エラーが出る - Preference -> Locations -> Command Line ToolsをXcode 9.0.1に切り替え 追記 別のプロジェクトで引き続き不具合が出るので治っていませんでした。

iOSで使えるフォント UIFontのfontName一覧 iOS11版

参考記事 Over&Out その後 UIFontのfontName一覧 これのiOS11版を行います。 今回はSwiftで書きました。 //Swift 4.0 let familyNames = UIFont.familyNames for aFamilyName in familyNames.sorted() { print(aFamilyName) for aFontName in UIFont.fontNames(forFamilyName: aFamilyName) { print("--", aFontName) } } ちなみに下はフォントの使用例です。 let myFont = UIFont(name: "AcademyEngravedLetPlain", size: 24) 結果 Academy Engraved LET -- AcademyEngravedLetPlain Al Nile -- AlNile -- AlNile-Bold American Typewriter -- AmericanTypewriter-CondensedBold -- AmericanTypewriter-Condensed -- AmericanTypewriter-CondensedLight -- AmericanTypewriter -- AmericanTypewriter-Bold -- AmericanTypewriter-Semibold -- AmericanTypewriter-Light Apple Color Emoji -- AppleColorEmoji Apple SD Gothic Neo -- AppleSDGothicNeo-Thin -- AppleSDGothicNeo-Light -- AppleSDGothicNeo-Regular -- AppleSDGothicNeo-Bold -- AppleSDGothicNeo-SemiBold -- AppleSDGothicNeo-UltraLight -- AppleSDGothicNeo-Medium Arial --...

Xcodeのフォント/色の設定の変更が効かない

イメージ
Xcodeにはフォント/色を変える機能があります。 ところが、最近これがうまく効かなくなってしまいました。Xcodeのバージョンは9.0です。 いらないものを消しても、次にXcodeを起動した時に復活してきます。 自分が取った対策は以下です。 今までに自分で作った設定をどこかにメモして ~/Library/Developer/Xcode/UserData/FontAndColorThemes の中を全て削除して初期状態にし、その後Xcode上で必要なものを作り直す。 ~は/Usersの下の自分フォルダです。煙突が付いた家のアイコンのやつです。 ~/Libraryは普通は見えないのでForkLiftというソフトを使いました。あるいは、optを押しながらFinderのGoをクリックすると出てきます。 画像ではoptを押してないです。optを押すとスクリーンショットが取れなかったので。 参考 https://qiita.com/Humangas/items/420ae56cc6db2d3d998d

Auto Layoutで発生する黄色の警告

イメージ
Auto Layoutで発生する黄色の警告は、自動修正機能がある。この自動修正機能は、エラーのあるソースコードに対するFixボタンのようなもの。以下は、この自動修正を行ったレポートである。なぜその警告が出るかはわからないのでひとまず置いといて、自動修正を行ったときの挙動を報告するものである。使用したXcodeのバージョンは9.0。 LeadingとTrailingに対するConstraint警告 Xcode9で既存のプロジェクトを開くとこんな警告が出ました。 Fixed leading and trailing constraints may cause clipping, one of them should have a constant ≥ standard space. 選択肢1 : Use Fixed Leading and Resizing Trailing Constraints Adjust to include a fixed leading constraint and a trailing constraint with a constant ≥ standard space. Recommended if the view is on the left half of the parent view. 選択肢2 : Use Resizing Leading and Fixed Trailing Constraints Adjust to include a leading constraint with a constant ≥ standard space and a fixed trailing constraint. Recommended if the view is on the right half of the parent view. 文を読んでも何を言っているかわからないので、簡単なプロジェクトを作ってテストしました。メインのviewの上にラベルを一つ置くものです。ラベルと親viewとの間にleadingとtrailingの制約を付けました(他の制約を述べるのは割愛)。この警告はleadingとtrailingのどちらかを26以上にすると発生しました。どちらかを26以上にしただけで両方の選択肢が出てきます。...

iOS8対策、アプリ内のhtmlファイルをWKWebViewで表示

アプリの中にhtmlファイルを持ち、それをWKWebViewで表示する方法です。iOS8向けです。iOS8のWKWebViewではhtmlファイルがロード可能なところにファイルがないと読み込めないので、その場所にコピーする手間が生じます。iOS9ではその必要はありません。ここで想定している規模は、ベースとなるhtmlの他に画像ファイルが何点かある場合です。向いているのは、文章と画像が中心のもので、ブラウザにレイアウトを任せたいものです。例えばアプリの使い方の説明などがあるでしょう。 関連するファイルのかたまりを管理するstruct これは、ひとつのページに関連するファイルをまとめて扱うためのstructです。この記事はひとつのページに画像が数点あるようなものを想定しています。 struct FileList { let baseHTML: String let includedFiles: [String] } baseHTMLは拡張子が.htmlのファイルです。 includedFilesはそこに含まれる画像ファイルなどの配列です。拡張子も含めます。 ViewController WKWebViewインスタンスを作成し、viewにWKWebViewインスタンスを貼り付けます。 上で定義したFileListのインスタンスを作り、load(fileList: , tempName: )を呼びます。 load(fileList: , tempName: )は後で説明します。 class ViewController: UIViewController { let webView = WKWebView() override func viewDidLoad() { super.viewDidLoad() webView.frame = self.view.frame self.view.addSubview(webView) let fileList = FileList( baseHTML: "test.html", includedFiles: ["Image.png...

In-app purchasesのmissing metadata

アプリ内課金でハマってしまった。 アプリ内課金でmissing metadataがローカライズのところに出て、消し方がぜんぜんわからん。 いろいろ調べて、スクリーンショットを追加したら消えた。 追記: ローカライズのところで名前とDescriptionに同じものを入れるのもNGとのこと。 アプリ内課金の画像をアプリの画像と同じにするのもNG。

Sketchが期限切れで使えなくなって困る

画像作成ソフトのSketchをAppleのApp Storeで購入した場合、バージョン43.2まではアップデート可能で使用権利があります(人によっては前後するかも)。 それ以降は期間が切れるのでバージョン44から使用権利がなくなりました。バージョン43.2は永久的に使用権利があります。 ところが、バージョン44(数日間のお試し)を入れたら古い方の43.2も使えなくなってしまいました。 ライセンスキーを古いメールのなかから発見し、それを入力することで43.2が普通に使えるようになりました。要するにライセンスキーを入れる必要があった。

アプリを iPad Pro 10.5 インチに対応させるには

イメージ
iPad Pro10.5インチが出ました。 既存のアプリを10.5インチ画面に対応させるわけですが、Xcode上でどこを設定すれば対応になるのか疑問です。ここで言う対応とは画面のサイズを取得したときに1112×834(10.5インチiPadのデータ)が得られる状態のことを言っています(コードは下記)。前回の12.9インチの時は苦労しました。 いろいろ触って見つけました。 今回はRequires full screenのようです。 なんでこんなに微妙なところにするのか Requires full screenをONにするとシミュレータで10.5を選択し起動しても9.7のサイズ(1024×768)が取得できます。 Requires full screenをOFFにするとシミュレータで10.5を選択し起動すると10.5のサイズ(1112×834)が取得できます。 override func viewDidLoad() { super.viewDidLoad() let deviceHeight = UIScreen.main.bounds.height let deviceWidth = UIScreen.main.bounds.width print(deviceHeight, deviceWidth) } 環境は、Xcode 8.3.3上でプロジェクトの作成とシミュレータ実行を行いました。 これ以外にある可能性もありますし、このやり方が常にうまくいくとは限らないと思いますが。

Swiftの廃止になったコンパイルエラー

公開しても特にメリットがあるものではないが、間違えて公開を押してしまった。 Prefix/Postfix '***' is reserved 前置/後置演算子の***は予約されています 【出現ver】Swift 2.1 var abc =5 //エラー var def= 10 //エラー 決められた正しい使われ方をしていない。 =の前後のスペースの取り方が統一されてない。開けるなら左右とも開ける、閉じるなら左右とも閉じる。 【非出現ver】Swift 3.1 【このコンパイルエラーに変更になりました】'***' must have consistent whitespace on both sides All stored properties of a class instance must be initialized before returning nil from an initializer イニシャライザからnilで返る前に、クラスインスタンスの全てのストアドプロパティを初期化しないといけない 【出現ver】Swift 2.1 class ClassA { var a: String init?(a: String?) { if a == nil { return nil //エラー } self.a = "" } } Swift 3.1ではエラーにならなかった。仕様変更か。 【非出現ver】Swift 3.1 Cannot assign to 'let' value '〜' letで宣言した定数に値を代入しようとした 【出現ver】Swift 2.1より前 【非出現ver】Swift 2.1 【このコンパイルエラーに変更になりました】Cannot assign to value: '***' is a 'let' constant Cannot assign to immutable value of type '***' 変更できない型'***'に代入でき...

iOS10.3 で MPMusicPlayerController クラスの挙動が変わった

デバイスをiOS10.3にアップデートしたら自作の音楽再生アプリでバグが発生しました。選んだ曲と別のものが再生されるバグです。 はじめに この問題について述べる前にMPMusicPlayerControllerクラスのことを軽く書きます。 デバイスに入っている音楽を自作アプリ内で流すとき、曲のリストを取得してMPMusicPlayerControllerクラスのインスタンス(この記事ではこれをPlayerと呼ぶことにします)にセットします。その後、Playerに対して曲の再生、停止などの指令を出します。 //.h MPMusicPlayerController *iPodMusicPlayer; MPMediaQuery *albumsQuery; MPMediaItemCollection *selectedAlbumCollection; //.m iPodMusicPlayer = [MPMusicPlayerController systemMusicPlayer]; //Playerの作成 albumsQuery = [MPMediaQuery albumsQuery]; //アルバム単位で情報を取得 selectedAlbumCollection = [albumsQuery.collections objectAtIndex:6]; //6のアルバムの情報を取得 [iPodMusicPlayer setQueueWithItemCollection:selectedAlbumCollection]; //取得した6のアルバムの情報をPlayerにセット [iPodMusicPlayer play]; //再生指令 Playerの作成するときは systemMusicPlayer applicationMusicPlayer のいずれかで作成します。 ここから今回の問題についてです。 何パターンかの操作を行うことで問題の症状を細かく炙り出しました。 症状1 曲の再生を停止すると、Playerに設定した曲のリストが無効になる。(再設定が必要。) Playerに対するstop指令で失う。pause指令では失わない。 曲のリストを失ったら、次に再生する前にリストを設定し直します。新たにMPMediaQueryから曲...

Xcode 8.2 はシミュレータでスクリーンショットを撮ると落ちる on El Capitan

El Capitan 上の Xcode 8.2 は、シミュレータに付いているスクリーンショット撮影機能(File -> Save Screen Shot)を使うと落ちます。厳密に言うと1回目はOKで2回目に落ちる。 対策は シミュレータで、Edit -> Copy Screen Previewで、File -> New from Clipboard 手間もそんなに変わりません。 stackoverflowの記事(英語)