2018年2月23日金曜日

変なメッセージ/Month 13 is out of bounds

2017年12月以降にmacOS HighSierraで開発してると、Month 13 is out of boundsってよく出るんだって。
うちでも出たわ。

要するに「13月は範囲外じゃ」ってメッセージなんだけど、べつにDateの関係とかいじってない。
CoreFoundation内のバグらしいって。
でもメッセージ出る以外にうちでは悪さしてないようなんで、そのまま様子見。
てか、さっさとバグなおせよな、Apple。

2018年2月9日金曜日

UIButtonのタイトル変更時のチラつき防止

問題

UIButtonのtitleTextを変更すると、表示がチラついてしまう。

たとえば以下のようにいくつもあるボタンのtitleTextを一斉に変えようとする場合などに、特に気にかかる。
最初にボタンの isHidden = true にしておき、titleText変更後に isHidden = false にしてもダメ。

for btn in buttonArray {
    btn.setTitle("ちんぴょろすぽーん", for: .normal)
}

解決方法

UIViewのアニメーションを切っておき、その間にtitleTextを変更、最後にアニメーションを許可すればよし。
肝心なことは、ボタンに対し layoutIfNeeded() を指示しておくこと。これやらないとやっぱりチラつく。

UIView.setAnimationsEnabled(false)
for btn in buttonArray {
    btn.setTitle("ちんぴょろすぽーん", for: .normal)
    btn.layoutIfNeeded()
}
UIView.setAnimationsEnabled(true)


layoutIfNeeded()ってのは、「レイアウトのアップデートが保留中だったら、すぐにSubviewをレイアウトしろ」ってメソッド。
すぐに…なんていうと、アニメーションの設定が false でも更新されてしまいそうだけど、そこは ifNeeded 必要になったら…ってことで、アニメの設定が true になるまで待ってくれるんだろう。
titleTextの変更も、ボタンの大きさが変更される要因の一つなので、こうしたレイアウト関係のメソッドで処理するんだろうね。

なおこのメソッドはメインスレッドからしか呼べない。(iOSの仕様上、UIの操作はメインスレッドからしか処理できないため)

2018年2月5日月曜日

アプリに絵文字使っちゃダメ?

情報ソース:9TO5MaciPhone Maniaほか

📱🙅🏻‍♀️🙅🏽‍♂️🤮
9TO5Macが伝えるところによると、iOSアプリのアイコンや、アプリ説明のためのスクリーンショットに絵文字を使ったものが、AppStoreからリジェクトされたという。
アップルによれば、絵文字の使用はアップルの商標・著作権の侵害に当たるのだというが。
「AppStoreは、アプリ内で絵文字を使用していることがどうやら著作権のルールを破っているとして、@getBittrackerの最新バージョンのバイナリを拒否しました。
うん、それは本当です。 私たちはスクリーンショットでの絵文字について話していますが、もっと重要なのはアプリ内での生のテキストです。」
この開発者サム・エカート氏はスクリーンショットに絵文字を使った(当然画像に変換してだろう)ことを言っているが、それに対するコメントで、アプリ内のアイコンとして絵文字を使った例を尋ねている人がいる。
「それらをゲームのアセットとして使うのではなく、単にあなたのUIを「装飾する」ことはどうでしょうか?」

これに対してエカート氏は「まさにうちらそれやってて、禁止されてるらしいよ」と返信している。

ガイドラインを見てみる

以下、App Store審査ガイドラインより抜粋(改行等筆者)
5.2 知的財産
アプリケーションには自分で作成したコンテンツ、または使用許可を取得したコンテンツのみを使用してください。
許可なくコンテンツを使用した場合はアプリケーションを削除します。
もちろん、他のデベロッパが他者の作品を許可なく使用した場合はそのアプリケーションが削除されます。
ご自分の知的財産権がApp Storeの他のデベロッパに侵害されているおそれがある場合は、Webフォームから申し立てを行ってください。
国によって法律は異なりますが、少なくとも以下の各項に留意する必要があります。
5.2.1 〜 5.2.4 略
5.2.5 Apple製品:既存のApple製品、既存のインターフェイス(Finderなど)、既存のアプリケーション(App Store、iTunes Store、メッセージなど)、既存のApple広告などとの混同を招くような、類似したアプリケーションは開発しないでください。
他社製のキーボードやステッカーパックを含め、アプリケーションやExtensionにAppleの絵文字を含めることはできません。
iTunesミュージックのプレビューを娯楽的な目的(フォトコラージュのBGM、ゲームのサウンドトラックなど)で、またはその他の承認されていない目的で使用することは許可されません。
アプリケーションでアクティビティリングを表示する場合は、アクティビティコントロールに類似する方法で、ムーブ、エクササイズ、スタンドのデータを表示することはできません。
アクティビティリングの使用に関して詳しくは、「Human Interface Guidelines」を参照してください。
ステッカーパックというのは、iMessageで使われる、LINEでいうスタンプにあたるもののことのようだ。

ほんとに違法なのか?

たしかにスタンプのデザインに絵文字を使うのはどうかと思うが、アプリの説明の画像や、アプリ内のアイコンとして無加工の絵文字を使うことがいけないことだろうか?
Apple製のデバイス上でしか使われないアプリ、AppStoreでしか表示されない画像に対し、絵文字という少々特殊なものとはいえ、Appleが用意したフォントの一種を使うなというのは権利の暴走じゃないか?
それを言ったら、通常のフォントも同じグラフィックデザインの一種として、使用できないんじゃないか? ってことになる。さすがにそこまで極端なことは言い出さないだろうけど、用意された便利そうなものを「使っちゃダメ」って言われるのには抵抗あるよな。

「アプリの文字入力欄でユーザーが絵文字を入力可能になっているのは問題ない」とも報じられているが、当たり前だわな。いちいち入力された文字が絵文字かどうかなんて判定してられんわ。そもそもユーザーが絵文字を使えないなら何のための絵文字かわからん。

いや、ちょうど絵文字をボタンのtitleTextとして表示して選ばせるアプリ作っててさ。なんでだよー、バカヤローという気分なのだな。
もし絵文字がダメなら、一般フォントのエジプト聖刻文字(ヒエログリフ)とかはどうなんだ?
𓀀𓀁𓀂𓀃𓀄𓀅𓀆𓀇𓀈𓀉𓀊𓀋𓀌𓀍𓀎𓀏𓀐𓀑𓀒𓀓𓀔𓀕𓀖𓀗𓀘𓀙𓀚𓀛𓀜𓀝𓀞𓀟𓀠𓀡𓀢𓀣𓀤𓀥𓀦𓀧𓀨𓀩𓀪𓀫𓀬𓀭𓀮𓀯𓀱𓀲𓀳𓀴𓀵𓀶𓀷𓀸𓀹𓀺𓀻𓀼𓀽𓀾𓀿𓁀𓁁𓁂𓁃𓁄𓁅𓁆𓁇𓁈𓁉𓁊𓁋𓁌𓁍𓁎𓁏𓁐𓁑𓁒𓁓𓁔𓁕𓁖𓁗𓁘𓁙𓁚𓁛𓁜𓁝𓁞𓁟𓁡𓁢𓁣𓁤𓁥𓁦𓁧𓁨𓁩𓁪𓁫𓁬𓁭𓁮𓁯𓁰𓁱𓁲𓁳𓁴𓁵𓁶𓁷𓁸𓁹𓁺𓁻𓁼𓁽𓁾𓁿𓂀𓂁𓂂𓂃𓂄𓂅𓂆𓂇𓂈𓂉𓂊𓂋𓂌𓂍𓂎𓂏𓂐𓂑𓂒𓂓𓂔𓂕𓂖𓂗𓂘𓂙𓂚𓂛𓂜𓂝𓂞𓂟𓂠𓂡𓂢𓂣𓂤𓂥𓂦𓂧𓂨𓂩𓂪𓂫𓂬𓂭𓂮𓂯𓂰𓂱𓂲𓂳𓂵𓂶𓂷𓂸𓂹𓂺𓂻𓂼𓂽𓂾𓂿𓃀𓃁𓃂𓃃𓃄𓃆𓃇𓃈𓃉𓃊𓃋𓃌𓃍𓃎𓃏𓃐𓃑𓃒𓃓𓃔𓃕𓃖𓃗𓃘𓃙𓃚𓃛𓃜𓃝𓃞𓃟𓃠𓃡𓃢𓃣𓃤𓃥𓃦𓃧𓃨𓃩𓃪𓃫𓃬𓃭𓃮𓃯𓃰𓃱𓃲𓃳𓃴𓃵𓃶𓃷𓃸𓃹𓃺𓃻𓃼𓃽𓃾𓃿𓄀𓄁𓄂𓄃𓄄𓄅𓄆𓄇𓄈𓄉𓄊𓄋𓄌𓄍𓄎𓄏𓄐𓄑𓄒𓄓𓄔𓄕𓄖𓄗𓄘𓄙𓄚𓄛𓄜𓄝𓄞𓄟𓄠𓄡𓄢𓄣𓄤𓄥𓄦𓄧𓄨𓄩𓄪𓄫𓄬𓄭𓄮𓄯𓄰𓄱𓄲𓄳𓄴𓄵𓄶𓄷𓄸𓄹𓄺𓄻𓄼𓄽𓄿𓅀𓅁𓅂𓅃𓅄𓅅𓅆𓅇𓅈𓅉𓅊𓅋𓅌𓅍𓅎𓅏𓅐𓅑𓅒𓅓𓅔𓅕𓅖𓅗𓅘𓅙𓅚𓅛𓅜𓅝𓅞𓅟𓅠𓅡𓅢𓅣𓅤𓅥𓅦𓅧𓅨𓅩𓅪𓅫𓅬𓅭𓅮𓅯𓅰𓅱𓅲𓅳𓅴𓅵𓅶𓅷𓅸𓅹𓅺𓅻𓅼𓅽𓅾𓅿𓆀𓆁𓆂𓆃𓆄𓆅𓆆𓆇𓆈𓆉𓆊𓆋𓆌𓆍𓆎𓆏𓆐𓆑𓆒𓆓𓆔𓆕𓆖𓆗𓆘𓆙𓆚𓆛𓆜𓆝𓆞𓆟𓆠𓆡𓆢𓆣𓆤𓆥𓆦𓆧𓆨𓆩𓆪𓆫𓆬𓆭𓆮𓆯𓆰𓆱𓆲𓆳𓆴𓆵𓆶𓆷𓆸𓆹𓆺𓆻𓆼𓆽𓆾𓆿𓇀𓇁𓇂𓇃𓇄𓇅𓇆𓇇𓇈𓇉𓇊𓇋𓇌𓇍𓇎𓇏𓇐𓇑𓇒𓇓𓇔𓇕𓇖𓇗𓇘𓇙𓇚𓇛𓇜𓇝𓇞𓇟𓇠𓇡𓇢𓇣𓇤𓇥𓇦𓇧𓇨𓇩𓇪𓇫𓇬𓇭𓇮𓇯𓇰𓇱𓇲𓇳𓇴𓇵𓇶𓇷𓇸𓇹𓇺𓇻𓇼𓇽𓇾𓇿𓈀𓈁𓈂𓈃𓈄𓈅𓈆𓈇𓈈𓈉𓈊𓈋𓈌𓈍𓈎𓈏𓈐𓈑𓈒𓈓𓈔𓈕𓈖𓈗𓈘𓈙𓈚𓈛𓈜𓈝𓈞𓈟𓈠𓈡𓈢𓈣𓈤𓈥𓈦𓈧𓈨𓈩𓈪𓈫𓈬𓈭𓈮𓈯𓈰𓈱𓈲𓈳𓈴𓈵𓈶𓈷𓈸𓈹𓈺𓈻𓈼𓈽𓈾𓈿𓉀𓉁𓉂𓉃𓉄𓉅𓉆𓉇𓉈𓉉𓉊𓉋𓉌𓉍𓉎𓉏𓉐𓉑𓉒𓉓𓉔𓉕𓉖𓉗𓉘𓉙𓉚𓉛𓉜𓉝𓉞𓉟𓉠𓉡𓉢𓉣𓉤𓉥𓉦𓉧𓉨𓉩𓉪𓉫𓉬𓉭𓉮𓉯𓉰𓉱𓉲𓉳𓉴𓉵𓉶𓉷𓉸𓉹𓉺𓉻𓉼𓉽𓉾𓉿𓊀𓊁𓊂𓊃𓊄𓊅𓊆𓊇𓊈𓊉𓊊𓊋𓊌𓊍𓊎𓊏𓊐𓊑𓊒𓊓𓊔𓊕𓊖𓊗𓊘𓊙𓊚𓊛𓊜𓊝𓊞𓊟𓊠𓊡𓊢𓊣𓊤𓊥𓊦𓊧𓊨𓊩𓊪𓊫𓊬𓊭𓊮𓊰𓊱𓊲𓊳𓊴𓊵𓊶𓊷𓊸𓊹𓊺𓊻𓊼𓊽𓊾𓊿𓋀𓋁𓋂𓋃𓋄𓋅𓋆𓋇𓋈𓋉𓋊𓋋𓋌𓋍𓋎𓋏𓋐𓋑𓋒𓋓𓋔𓋕𓋖𓋗𓋘𓋙𓋚𓋛𓋜𓋝𓋞𓋟𓋠𓋡𓋢𓋣𓋤𓋥𓋦𓋧𓋨𓋩𓋪𓋫𓋬𓋭𓋮𓋯𓋰𓋱𓋲𓋳𓋴𓋵𓋶𓋷𓋸𓋹𓋺𓋻𓋼𓋽𓋾𓋿𓌀𓌁𓌂𓌃𓌄𓌅𓌆𓌇𓌈𓌉𓌊𓌋𓌌𓌍𓌎𓌏𓌐𓌑𓌒𓌓𓌔𓌕𓌖𓌗𓌘𓌙𓌚𓌛𓌜𓌝𓌞𓌟𓌠𓌡𓌢𓌣𓌤𓌥𓌦𓌧𓌨𓌩𓌪𓌫𓌬𓌭𓌮𓌯𓌰𓌱𓌲𓌳𓌴𓌵𓌶𓌷𓌸𓌹𓌺𓌻𓌼𓌽𓌾𓌿𓍀𓍁𓍂𓍃𓍄𓍅𓍆𓍇𓍈𓍉𓍊𓍋𓍌𓍏𓍐𓍒𓍔𓍕𓍖𓍗𓍘𓍙𓍚𓍛𓍜𓍝𓍞𓍟𓍡𓍢𓍣𓍤𓍥𓍦𓍩𓍪𓍫𓍬𓍭𓍯𓍰𓍲𓍳𓍴𓍵𓍶𓍷𓍸𓍹𓍺𓍻𓍼𓍽𓍾𓍿𓎀𓎁𓎂𓎃𓎄𓎅𓎆𓎇𓎈𓎋𓎌𓎍𓎎𓎏𓎐𓎑𓎒𓎓𓎔𓎕𓎖𓎗𓎘𓎙𓎚𓎛𓎜𓎝𓎞𓎟𓎠𓎡𓎢𓎣𓎤𓎥𓎦𓎨𓎩𓎪𓎫𓎬𓎭𓎮𓎯𓎰𓎱𓎲𓎳𓎵𓎶𓎷𓎸𓎹𓎺𓎻𓎼𓎾𓎿𓏀𓏁𓏂𓏃𓏄𓏅𓏆𓏇𓏈𓏉𓏊𓏋𓏌𓏍𓏎𓏏𓏐𓏑𓏒𓏓𓏔𓏕𓏖𓏗𓏘𓏙𓏚𓏛𓏜𓏞𓏟𓏠𓏡𓏢𓏣𓏤𓏥𓏦𓏧𓏨𓏩𓏪𓏫𓏬𓏭𓏮𓏯𓏰𓏱𓏲𓏳𓏴𓏵𓏶𓏷𓏸𓏹𓏺𓏻𓏼𓏽𓏾𓏿𓐀𓐁𓐂𓐃𓐄𓐅𓐆𓐇𓐈𓐉𓐊𓐋𓐌𓐍𓐎𓐏𓐐𓐑𓐒𓐓𓐔𓐕𓐖𓐗𓐘𓐙𓐚𓐛𓐜𓐝𓐞𓐟𓐠𓐡𓐢𓐣𓐤𓐥𓐦𓐧𓐨𓐩𓐫𓐬𓐭𓐮
雀パイやドミノやトランプは?
🀀🀁🀂🀃🀅🀋🀙🀟🀢🀗🀴🁈🁵🁷🂡🂷🂼🂾🂮🂾🃟
iOS11だと、聖剣文字は見えるが、麻雀牌以下は□に化けちゃう。まあいい、聖剣文字使ってやれ。ヒヒヒヒ…

2018年1月31日水曜日

メモ:音の同時再生

情報源:【iOS】音楽を止めずに効果音を同時に再生するには

まだちゃんと試してないけど、情報見つけたのでメモ。
AppDelegateに以下のコードを書いておくと同時再生できるんだとか。

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    do {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)
    } catch {
        print("エラー")
    }
    
    return true

}

AVAudioPlayerで効果音を連続再生

やりたいこと

ボタンを押すたびにピコーンというSEを鳴らすのだが、高速で連続してボタンを押した場合に音が鳴らないことがある。

解決法

音を重ねて鳴らす場合はAVAudioPlayerをしまうプロパティを配列に入れ、再生が終わるまで保持するなどすればいい。(終わったのを消すのがSwiftではちょっと面倒になったけど)

重ねて鳴らさなくていいならば、前の音が再生中なら音を止め、再生ポイント(currentTime)を先頭に戻してやればいい。

具体的には以下のように。

if correctSound.isPlaying {
      correctSound.stop()
}
correctSound.currentTime = 0
correctSound.play()

2018年1月30日火曜日

AVAudioPlayerで初回再生遅延

問題

ゲームで使う短いサウンドをAVAudioPlayerで鳴らすのだが、初回だけ一瞬再生が遅れてしまう。2回目以降の再生では遅延は起きない。

soundPlayer?.prepareToPlay()
をあらかじめ処理しておいてもダメ。

volume = 0
であらかじめ1度再生させ、直後にvolumeを元に戻してみたら、なぜか音が鳴ってしまう。

解決法

現在不明。

2018年1月14日日曜日

任意の位置の文字を取り出す

やりたいこと

たとえば"abcdefghijklmn"という文字列の中から、任意の位置の文字(文字列)を取り出したい。

やり方

let str = "abcdefghijklmn"
let startIndex = str.index(str.startIndex, offsetBy: 0) //①
let endIndex = str.index(startIndex, offsetBy: 1) //②
let s = String(str[startIndex..<endIndex]) //③SubStringからStringに直しとく

昔のBASICだとRight$、Left$、Mid$とかの関数でちょいちょいできたんだけど、Swiftだとちょっと面倒。
文字を取り出す開始位置、終了位置を定義し、それをSwiftのRange(範囲指定)の書き方で指定してやる必要がある。
①が開始位置、②が終了位置を設定するもの。

①のoffsetBy:は何文字目かということ。ここでは最初の文字なので0にしてる。

②が①で始まる文字から始めて何文字目を終了位置にするかということ。1文字だけならoffsetBy:に1を指定すればいい。

それを
(str[startIndex..<endIndex])
と範囲指定をして取り出す。
新しいfor構文の for i in 0..<10 と同じようなやり方だ。[ ] で囲むのがなんか配列っぽい。

注意点

ただ使うだけならこれだけでいいんだけど、取り出した文字列はSubStringというものになってて元もの文字列を参照しているだけだ。そのため元の文字列(ここではstr)が消えると消えてしまうのだそうだ。
だから独立した文字列にするためString( )で囲んでやってる。

Swift4より前では別の書き方をしていたそうだが、それは知らんのでここでは触れない。