Objective-c iOS8以降でTableViewのサイズが変更できない…!!

Objective-c iOS8以降でTableViewのサイズが変更できない…!!な時

presentationの種類をform sheetに指定したときのことです。

色々試してみても全くサイズが変更できず、
時間をくわれてしまいました。

結局、
self.preferredContentSize = CGSizeMake(指定したいwidth, 指定したいheight);

これをviewDidLoadに追加したら
いとも簡単にサイズが変更できました。

どうやらiOS8以降でこの現象は起きるみたいです。

むきー!!

※ちなみにiPad以外ではmodalで画面遷移するときの
presentationの種類は常にfull screenのようです。
これについてもかなりはまりました…

by 芦野輝明
twitter→https://twitter.com/teriyakiegg

Xcode

Now loading・・・のバーを作る

Webサイト作成 TIPS
Flash

「Now Loading」というダウンロードの割合に応じて進むバーを作る

 Windows、Macromedia FlashMX Web作成

動画などの重いページ、また凝ったスプラッシュページを作る必要がある時、そのページが表示されるまで真っ白、というのは余りにユーザーに不親切です。
ここではよくある「Now Loading…。」などとページを読み込むまで表示されているバーの作り方の説明をします。(Flashについてそれなりの知識がある人が前提です。)

  • 矩形ツールで、横長の四角形を作ってバーにします。これが100%読み込まれた時の長さになるようにします。
  • ここで、「線のカラー」と「塗りのカラー」を一緒にしておくのがポイントです。
  • 作った四角形を、ムービークリップに変換します。
  • 次に、ただバーが進むのではなく、数字でも何%ダウンロードしたかが分かるように、テキストを入れます。具体的にはバーの上でも下でも好きなところに、「Now Loading」と書きす。
  • ここで、テキストボックスは横長にしておくのがポイントです。(バーの長さと同じぐらい)
  • 「Now Loading」の文字を、プロパティインスペクタで「ダイナミックテキスト」にします。
  • また、同じく文字のプロパティインスペクタで埋め込みフォントのアウトラインを次の小文字・数字・および次の文字「Now Loading.k/(%) 」にします。指定する文字の最後に半角スペースを入れるのがポイントです。
  • バーのムービークリップのインスタンス名を「bar」にします。文字のインスタンス名を「message」にします。
  • ダイナミックテキストと、バーのムービークリップの両方を選択しながら、混合のムービークリップに変換します。
  • このムービークリップに、次のようにアクションスクリプトを記述します。

>~ここから~

 onClipEvent(load){
         _parent.stop();
         bar._xscale=0;
         function loadingAct(){
 	var parcent = Math.round(loadedBytes/totalBytes *100);

message.text=”Now Loading…”+loadedBytes/10+”k/”

 +totalBytes/10+"k("+parcent+"%)";

bar._xscale=parcent;
}

 }
 onClipEvent(enterFrame){

totalBytes=_parent.getBytesTotal();
loadedBytes=_parent.getBytesLoaded();
if(loadedBytes>=totalBytes){
_parent.play();
}else{
loadingAct();
}

 }

~ここまで

  • このムービークリップが終わったら、次のフレームに目的のムービーなどを配置して、完成です。
  • 尚、上のアクションスクリプトはローカルで試しても一瞬で終わってしまうので、試す時はwebに実際上げてみてください。

NotePad

フリーソフトでWebサイトを編集する

Windowsに標準でついてくるメモ帳。
非常にシンプルな機能です。

Not allowed to start service Intent { act=com.google.android.c2dm.intent.REGISTERのエラー

Android

Androidのプッシュ通知、GCMを登録しちゃう、GCMRegistrationTask.doInBackground
ですが、セキュリティの厳しいスマホだと、これを実行した瞬間にFatal Exceptionで落ちます。

 12-11 17:47:54.279: E/AndroidRuntime(11444): FATAL EXCEPTION: AsyncTask #1
 12-11 17:47:54.279: E/AndroidRuntime(11444): Process: takuru.user, PID: 11444
 12-11 17:47:54.279: E/AndroidRuntime(11444): java.lang.RuntimeException: An error occured while executing doInBackground()
 12-11 17:47:54.279: E/AndroidRuntime(11444): 	at android.os.AsyncTask$3.done(AsyncTask.java:300)
 12-11 17:47:54.279: E/AndroidRuntime(11444): 	at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
 12-11 17:47:54.279: E/AndroidRuntime(11444): 	at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
 12-11 17:47:54.279: E/AndroidRuntime(11444): 	at java.util.concurrent.FutureTask.run(FutureTask.java:242)
 12-11 17:47:54.279: E/AndroidRuntime(11444): 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
 12-11 17:47:54.279: E/AndroidRuntime(11444): 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
 12-11 17:47:54.279: E/AndroidRuntime(11444): 	at java.lang.Thread.run(Thread.java:841)
 12-11 17:47:54.279: E/AndroidRuntime(11444): Caused by: java.lang.SecurityException: Not allowed to start service Intent { act=com.google.android.c2dm.
 intent.REGISTER pkg=com.google.android.gms (has extras) } without permission com.google.android.c2dm.permission.RECEIVE
 12-11 17:47:54.279: E/AndroidRuntime(11444): 	at android.app.ContextImpl.startServiceCommon(ContextImpl.java:1562)
 12-11 17:47:54.279: E/AndroidRuntime(11444): 	at android.app.ContextImpl.startService(ContextImpl.java:1539)
 12-11 17:47:54.279: E/AndroidRuntime(11444): 	at android.content.ContextWrapper.startService(ContextWrapper.java:494)
 12-11 17:47:54.279: E/AndroidRuntime(11444): 	at com.google.android.gms.gcm.GoogleCloudMessaging.c(Unknown Source)
 12-11 17:47:54.279: E/AndroidRuntime(11444): 	at com.google.android.gms.gcm.GoogleCloudMessaging.register(Unknown Source)
 12-11 17:47:54.279: E/AndroidRuntime(11444): 	at takuru.user.gcm.GCMRegistrationTask.doInBackground(GCMRegistrationTask.java:43)
 12-11 17:47:54.279: E/AndroidRuntime(11444): 	at takuru.user.gcm.GCMRegistrationTask.doInBackground(GCMRegistrationTask.java:1)
 12-11 17:47:54.279: E/AndroidRuntime(11444): 	at android.os.AsyncTask$2.call(AsyncTask.java:288)
 12-11 17:47:54.279: E/AndroidRuntime(11444): 	at java.util.concurrent.FutureTask.run(FutureTask.java:237)
 12-11 17:47:54.279: E/AndroidRuntime(11444): 	... 3 more

下記に答えがありましたが、

http://stackoverflow.com/questions/22117317/securityexception-not-allowed-to-start-service-intent-act-com-google-android

AndroidManifest.xml内のパーミッション設定で、下記のように書かないといけないようです。

 <!-- This app has permission to register and receive data message. -->
   <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

大事なのは、コメントの

 This app has permission to register…

ってやつです。

これって、ただのコメントかと思ってましたよね。
実は、大事なものだったみたい…

ちなみに、私はこれ書いてあるのに、なんでブチ落ちるの??
と思ってましたが、なんと、AndroidManifest.xml内に

 <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

がコメントなしでもう一個書いてあって、そちらを消したら落ちなくなりました!(^▽^)/