ビギグラマーのノート

自作PCやプログラミングについてのブログです。

【Swift3】WKWebViewの使い方とロード後に呼び出されるメソッド

 iOS8.0からWKWebViewが追加され、現在よりセキュアで安定したWKWebViewの使用をAppleは推奨しています。WKWebViewはStoryBoard上でまだ扱えないのでコードを書いていく必要があります。

WKNavigationDelegateはwebViewが活動中に色々といじれる便利なプロトコルなので一度リリースノートを読んでおくといいでしょう。

WebKit | Apple Developer Documentation

今回はwebページのtitleを獲得するためにページのロード後に呼び出される func webView(WKWebView, didFinish: WKNavigation!) を使用しました。またhttpsとhttpのどちらにも対応する場合 Info.plist -> App Transport Security Settings -> Allow Arbitrary Loads in Web Content を YES にする必要があります。この設定でどちらもセキュアに通信できるのはiOS10以上のデバイスのみです。iOS9や8対応の場合は Allow Arbitrary Loads もYESにします。しかしこれはあまり推奨されない方法です。

2017/03/14現在iOS10のシェアは76%でiOS9のシェアは16%なのでそろそろアプリのサポートを切ってもいい頃合いだとは思います。

App Store - Support - Apple Developer

 webのページを戻したり進めたりする場合昔はScreen Edge Pan Gesture を設置して戻る際の挙動を書かなければいけませんでしたが、今は webView.allowBackForwardNavigationGestures = true にしておくだけで簡単に設定できます。

TabBarの使い方

環境 Swift 3, app for iOS10

 様々なアプリケーションで使用されるTabBarについて書いていきます。TabBarは例えばApple純正の時計アプリとかを想像してもらうとわかりやすいかもしれません。

f:id:BegiGrammer:20170312081145p:plain

 TabBarとはこのように下にいくつかのタブが並び画面を簡単に移動することができる機能です。複数の画面をあらかじめ読み込ませた状態で画面移動するため、ページ移動の負荷が軽くなります。また同じような機能をボタンによるSegueで実現しようとするとTabBarと比べて複雑になりがちです。

 StoryBoardとしてはこのような形になります。

f:id:BegiGrammer:20170312081914p:plain

  TabBarはこのようにメインのコントローラーで複数のページを制御する形です。メインとサブをつなぐSegueはRelationshipになります。

f:id:BegiGrammer:20170312082732p:plain

  あらかじめ出来合いのTabBarControllerがあるのでそこから始めると容易にTabBarを実装できます。新たにitem(子ページ)を追加する場合はViewController追加後Tab Bar Itemを置き、親ページとRelationshipのSegueで接続することで追加ができます。

f:id:BegiGrammer:20170312082703p:plain

 TabBarのアイコンは標準のアイコンのほか、Retinaディスプレイで60x60ピクセルの画像を設定することができます。この場合ファイルの名前の最後に@2xをつけてください。(例: example@2x.png) 画像の色は透明部分以外TabBarItemに設定した色で塗りつぶされ表示されます。(上のStoryBoardの画像の歯車のアイコンはもともと黒色でした)

f:id:BegiGrammer:20170312083357p:plain

  違うTabBarのアイテムを選択した時に、どれを選択中かの値を受け取ることができます。UITabBarDelegateスーパークラスに追加してください。また、tabBarのデリゲートとしてselfを選択しておいてください。

func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem){}

 item.nameで選択中のアイテムの名前を知ることができ、item.tagで設定したtagの数値を受け取ることができます。

 TabBarの操作によって既に読み込まれた違うページを表示する場合、子ページ内のClassである幾つかのメソッドが実行されます。

f:id:BegiGrammer:20170312082655p:plain

 TabBarのitemはを選択された時にこの図のように4つのappearとdisappearメソッドを繰り返します。すなわちviewDidLoadは最初の一回しか行われません。起動時にitem2などの最初に現れないページを読み込ませる場合は、私はloadViewIfNeededを使用しています。

もちろんですが、TabBarのページ変更はユーザーが頻繁に行う場合があるので、この4つにはなるべく軽い処理か条件付けにより最適最小のものを実行するようにする必要があります。(まあそんなに気にしないでも良いレベルですが・・・)

【Swift】キーボードの使い方あれこれ

 Swift3でiOSのキーボードを使う際に色々とセッティングできるのでまとめておきます。

 -キーボードのreturn(改行)ボタンを押した際に実行されるメソッド

StoryBoardを使わずに直接コードを入力することもできますが、簡単なので今回はStoryBoardを使います。

f:id:BegiGrammer:20170312045645p:plain

 コード上にDid End On ExitのActionFuncを作るだけ。これを使うとtextField.resignFirstResponder()を使うことなく自動的に閉まるようになります。

 

 -手動で閉める

上にも書きましたが、

textField.resignFirstResponder()

 で指定したtextFieldの編集を終え、returnを押した際に閉めることができます。

 

 -デフォルトでreturnになっているのを色々変える

textField.returnKeyType = UIReturnKeyType.search

これで色々とUIReturnKeyTypeのに色々変更可能です。

UIReturnKeyType - UIKit | Apple Developer Documentation

 現在YahooとかGoogleとかは消去されて選択してもSearchだけになっているようです。

EVGA GTX 1080/1070 HYBRID レビュー

 GTX1080/1070 リファレンス基板用の簡易水冷を購入しました。値段は$104で米amazonで購入しました。最初からGTX1080に簡易水冷が付いているタイプもあるのですが、本格水冷に改造するつもりだったのが予想外の出費が重なりお手軽な簡易水冷に落ち着きました。2017/03/08現在GTX1080/1070用の後付け簡易水冷を発売しているのはEVGAだけのようです。

 全体の寸法としてはラジエーターとファンを合わせて厚み約5cm。

f:id:BegiGrammer:20170309051510j:plain

f:id:BegiGrammer:20170310063545j:plain

f:id:BegiGrammer:20170310063639j:plain

 ホースの長さが約35cm。ITXに使用するには少し長い感じです。ホースは表面をナイロンの編み込みで覆われています。水枕は厚さ3cm、これにリファレンスのGPUチップ周りにある4つの穴と同間隔でネジ穴があり直接これでネジ止めする模様。グラボのめもりーを冷やすためのシッコロファンとラジエータのファンはどちらもGPUからの電源供給で作動します。しかしどちらも回転数のモニタ及び調整を行うことはできません。

 この簡易水冷セットにバックパネルは付属しませんが、EVGA 1080 SCのバックパネルがそのまま使用できました。

 水枕の音に関して、起動時に少し腹がなるような音がしますが動かしていればほぼ無音におさまりました。

 OCCT 4.5.0のGPUテストが何故か動かないので温度を性格にみることはできませんでしたが、3DmarkのTime Spyを3周しておよそ55℃の結果になりました。簡易水冷導入前は一周目で80℃まで行き、クロックが下がる状態でした。

 これでITXのサイドパネルを完全に閉めた状態での運用ができます。

 Tom Clancy's Chost Recon を最高設定144Hzで4時間ぶっ続けでやったところ、最高温度が56℃という結果になりました。サイドパネルからラジエーターの空気を排気しているのですが結構そこがネックな感じで、サイドパネルを取り外すと大体50℃で安定しました。

 最終的にはバックにラジエーターとファンを背負わせる形にするのでおそらくあと2,3℃冷える様になると思います。その場合はケースのパイプの穴を通さなければならないので、一度ホース、ラジエーター、水枕をバラさなければなりませんが・・・

PC電源に使用されるコネクタ ピンの規格 & スリーブ化

 PC電源をスリーブ化・ケーブル長の調整をする際に必要になってくるのがコネクタピンです。PC電源のコネクタピンには3種類あり、

 PWM等の4ピンもしくは3ピン、電源ボタンを接続するコネクタピンである2.54mmピン

f:id:BegiGrammer:20170306103409j:plain

 24ピンコネクタやPIC-E等に使われる(名称不明)のこいつ サイトによって名前がまちまちだが「ATX Connecter pin female」とかで検索すると出てくる 圧着工具では2.54mmと同じとこで圧着できる

f:id:BegiGrammer:20170306105818j:plain

最後に今はあまり使われていない4pin ペリフェラル 電源コネクタ ファンやIDE時代のHDDの電源供給用に使われていたもの ピンの型番は AMP 60620-1 

f:id:BegiGrammer:20170306112433j:plain

 当たり前ですがどのピンにも互換性はなく、両翼のATXコネクタピンと2.54mmを間違えて買うとゴミが増えます。こいつはPC Modding部品を扱う店には確実にあるかと思います。私の知っているATXコネクタピンを取り扱っている店は

www.aquatuning.us

 

www.oliospec.com

こことか。あとAmazon.comに個人で売っているのを少し見かける程度です。昔大阪シリコンハウスで見かけたような気がしないでもないですが。名古屋大須にもあったかなーと 。秋葉原は詳しくないのですが、多分どこかにあるでしょう。しかしそのほか一切のことはわかりません。(無能感

 スリーブ化に関して編組スリーブは探せば結構あるので入手には困らないでしょう。

 あとスリーブ化する際にピン抜きが必要になりますが、ATXコネクタピンなら2本まとめてまっすぐにしたホッチキスの針が使えます。

f:id:BegiGrammer:20170306114628j:plain

 こんな感じにペンチで曲げて・・・

f:id:BegiGrammer:20170306114714j:plain

 このように端子の間にさして、コードを力一杯引っ張ります。するとピンの両翼の返しの部分が中に押し込まれて抜けるようになります。

IntelのCPU保証

 intelのBOX版CPUには大抵3年保証がついており、CPUの自然故障等に代替保証を受けることができます。私は現在ITXのスリムケースで苦戦しており、すでに一人の6700Kを葬っています。ただし交換希望のこのCPUが壊れた時はKP41病にかかっていないかの確認中、負荷をかけていない状態でCPUが故障したので自然故障に入る?はずです。

f:id:BegiGrammer:20170222150704j:plain

 保証を受けるにはプロセッサ本体、箱、説明書的なのが必要になります。intel insideのシールは保証には関係ないようです。(まあ、あっても貼りませんけどね)
 保証の申し込みはここでできます。書く内容はそんなにないのですが、私は新品マザーでCPU & Cooler, power supply, Beep Speakerのみで起動した際に通常鳴るはずのメモリエラーのビープ音がならないことをあげ、このCPUが壊れていることを説明しました。

 2営業日後、どういったサポートを受けるかといったメールが届きました。メールの内容は名前、住所、電話番号を記入して、サポートを選んでくださいといったものでした。サポートは2種類あり通常のCPUがIntelに届いてから6から7営業日で代替品を送るStanderd Warranty Replacement(SWR)と、Intelがあらかじめ代替品を送り同時に私も手元のCPUを送るChross Shippingです。Chross Shippingでは$25の補償金が必要になるとのことでした。(最終的に手元に帰ってきます)

 私は特に急いでいないですし、めんどくさいのでSWRを選択しました。

 すでに手元に動くであろう6700Kがもう一つあるので代替品が送られてきたら、パッケージを開けずに売ることを考えています。7700Kが登場したとはいえ大した性能差はないので、まだ$300くらいで売ることができます。AMDがRyzenで返り咲いたらもうちょっと値段が下がるかと思いますが...

 自分の住所、氏名、電話番号と希望する返却サービスを返信メールで伝えると約1日挟んでintelに壊れたCPUを送る方法が書かれたメールが届きました。(真夜中にメールが届いたのでサポートセンターはアメリカにないのかな?担当者の名前もアメリカっぽくないし)

 

  • 送り方を返信してきたメールをコピーして一緒に送ること
  • 返却期限は60日間
  • ちゃんと緩衝材に包むこと
  • SWR(自分でパッケージングしてUPSに持って行く場合)では包みの外側にメールで指定されたSWR case numberを書くこと

 週の初めに交換手続きを開始したのですが、メールのやりとりに1週間、intelが代替品を送ってくるまでにさらにもう1週間かかるので、まあ結構の間PCが使えないことになります。(もしメールの手続きが1週間以上に長引きそうだったらintel関連のを全部売ってAMDのRyzen 7に備えようかと思っていました)

 フォームを送ってから代替品が届くまでおよそ1ヶ月と言ったところでしょうか。Chross Shippingならだいぶ早くなると思いますが$25がめんどくさいところが玉に瑕ですね。 

ContainerViewとSegue

環境 Xcode 8.2.1 Swift 3.0.2

 Segueで値を受け渡しするときに受け渡し先にContainerViewが存在し、そのClass内でSegueで渡す値を使用する場合ContainerViewの読み込まれる順番を考慮しないといけません。

f:id:BegiGrammer:20170209133707p:plain

  読み込まれる順番としては

  1. Segueのタイミング
  2. ContainerViewのViewDidLoad
  3. ViewControllerのViewDidLoad
  4. ViewControllerのViewWillAppear
  5. ContainerViewのViewWillAppear

 このようになります。私は最初ViewControllerのViewDidLoadが読み込まれると思い、ViewControllerのViewDidLoad内でstaticにした変数にSegueで送られた値を入れ、ContainerViewのViewDidLoadでインスタンス化しその変数を取得する方法を試しました。しかし上記の順番を見れば一目瞭然なように、これではSegueで送られた値が正常にContainerView内で読み込まれません。

 解決方法としてViewControllerとContainerViewControllerをつなぐEmbed Segueを利用してViewControllerで受け取った値をContainerViewControllerに受け渡します。言葉にするよりコードを見てもらった方が早いですね。

f:id:BegiGrammer:20170209141720p:plain

 これでFirstViewController → ViewController → ContainerViewControllerへの値の受け渡しが正常に完了しました。