ブログランキング・にほんブログ村へ


iPhone/iPad用潜水艦ゲームアプリ ソナーエコー iTunesにて公開中

2017年10月13日

[iOS]クリップボードUIPasteboardに貼ったtextをメモに貼り付けられない

iOSのバージョンによるのかもしれない。iOS11。

今更ながらはじめてテキストをクリップボードに貼り付けようとしてググって見つかったやり方。

NSString* myText = @"貼り付けたいテキスト";
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
[pasteboard myText forPasteboardType:@"public.text"];

こんな風に書いてあるところがほとんどなんだけど、これだと「メール」には貼り付けられるのだけど、「メモ」だと謎の添付ファイルになってしまう。

なんで?

クリップボードにコピーする

ここが参考になった。
つまり"public.text"では大雑把すぎるらしい。

"public.utf8-plain-text”

で「メモ」にも貼り付けられるようになった。

"public.plain-text"
でも大丈夫かもしれない。
試してないけど。
posted by みこあいさ at 12:20| iOS開発

2017年09月22日

[iOS11] whose usage (0x04) doesn't specify MTLTextureUsageShaderRead (0x01)'

ここ数ヶ月AppStoreの上から目線レビューにぐったりしてしまい、アプリから離れて自分磨きということで英語数学物理の勉強してた。

もうiOSもググればすぐわかるような細かいことしか問題がでなくて、特に書くこともないしなぁと思ってたところにiOS11。

いつもことながらプレリリースを入れて試せるような余剰機材もなく正規発表になってやっと試せるのだけど。
iOS9のときは日本語問題があって、iOS10は何もなし。iOS11は…
64ビットコードじゃないと駄目っていうんで古いアプリがいくつか動かなくなるのはどうしたもんかな、と。
でもほとんどのアプリが動いた…と思ってたら、Metalが…ひょっとして奇数番OSがいかんのか。

なんか画面が激しくちらつくようになってる。これはなおさんといけない。xcodeで調べると(このxcodeがまたリリース直後は混んでるのかダウンロードできない)、
ValidateFunctionArguments:3384: failed assertion `Fragment Function(XXXXXX_fragment): Shader reads texture (colorTexture[0]) whose usage (0x04) doesn't specify MTLTextureUsageShaderRead (0x01)'
こんな感じのエラーがrenderCommandEncoderWithDescriptorのとこでて止まる。
MTLTextureUsageShaderRead (0x01)'はMTLTextureUsageRenderTarget (0x04)'になったりする。

ぐぐってみると、少ないけどunityで出てるらしく困ってる人が何人か?いた。
でもそれに対する解決が、MetalをOpenGLに変えろ、とかいう逃げの一手。そのうち誰か直してくれるでしょ、ということらしい。なにそれ。プルダウンの項目変えても勉強にならんじゃないのかな。プロの人かな。
iOSの方の問題だよ、という人もいたが、iOS9の日本語のときも結局そのままになったこともあり、Appleには期待できない。βで文句言わなかった奴は黙れ、ということかな。それも道理。

このエラーは何を言ってるかというと、テクスチャの使用用途の設定がちゃんとされてないよ、ということらしい。
そんなもの指定したことないよ、と思ったけど、実はあった。
MTLTextureDescriptor

usgaeメンバに用途を指定する。
具体的には、レンダー結果になるようなものには
MTLTextureUsageRenderTarget
引数みたいに読み出しに使うものには
MTLTextureUsageShaderRead
じゃあ、影みたいにレンダリングしたものを次のパスで読み出すものは?
MTLTextureUsageRenderTarget|MTLTextureUsageShaderRead
と ORでつなぐ。
これをあちこちエラーの出てるもの参考によく考えてセットすると、エラーは消えた。

でもちらつきは直らない。

じゃあそれはなにか?
というと
colorAttachment.loadActionのデフォルト値の動作が変わったらしい。
デフォルトのMTLLoadActionDontCareは、何もしてくれるな、という意味だったのだが、
どうせ全部上書きするんだから何もしなくていいよーという意味でデフォルトでほっといたら、iOS11からはそれだったらわざとめちゃめちゃにしてやるーって感じになってる。(わざとってことはないだろうけど)
何もしない(仮にA)、の上にB、を書いたらBのはずが、Bになるとは限らない。Aを知る方法はないので結果がAかどうはわからないけどとにかくBとは限らない。なんでか知らないけどそうなってた。GPUが超並列処理だということが関係してるんじゃないかとは思う。はっなんか量子論じみてる。まさかこの世は超並列処理されたレンダー結果… それはおいといて。
もちろんパイプラインで順次処理していくものが飛び越すことはない。だからそういう意味で前の処理を受け継ぐという意味で確定した結果Aに対するMTLLoadActionDontCareの動作は前の通り。(ますます量子論じみてる)しょっぱながまずい。多分量子ノイズというやつだ。(嘘)
DontCareのほうが早そうなのでそれにしてたのだけど、仕方ないのでMTLLoadActionClearを指定したら治った(つまり箱の中の猫をのぞいた…もういいって)。
この件についてはぐぐっても全くひっかからない。世界初発見?まさかね。単に検索キーワードがまずいのだろうと。

それと、上のMTLTextureDescriptorのusageだけど、PNGやPVRを読んだテクスチャのデスクリプタには何も設定してないのに何故か問題ない。MTLTextureUsageShaderReadが要りそうなものだけど。
もうこうなるとなんでも怪しいので、一応入れてみたけど。

関係ないけどcocosPodのpod updateでtrap 6とかいうのが出たのも地味に効いた。
これはcocosPodのアンインスコ→再インスコで治った。

今回はちょっときつかった。

※ちなみにもはや化石のObjective-C。もっというとObjective-C++。低確率だけどSwiftだと違うってことはあるかもしれない。

2017.9.29追記
iOS 11.0.1がリリースされたので念のため試したが、やはりDontCareの件は変わらず。




タグ:iOS Xcode metal
posted by みこあいさ at 13:57| iOS開発

2017年02月28日

[iOS]Code signing is required for product type 'Application' in SDK 'iOS 10.2'

iOS MetalのTessellationの勉強がしたいと思ってAppleのサンプルプロジェクトを落としてきたら

Signing for "MetalBasicTessellation-iOS" requires a development team. Select a development team in the project editor.
Code signing is required for product type 'Application' in SDK 'iOS 10.2'

こんなエラーが。

ProjectのTARGETから、iOSのほうを選び(OSX用とiOS用とあるので注意)
Siginingの項目でTeamで何かを選んでやると(個人だと1つしかないはず?)それで通った。

(ひょっとしたら、一旦Automatically manage signingを外してやる必要があるかもしれない。このへん色々いじった結果通ったので)
posted by みこあいさ at 09:34| iOS開発