view monitoring tips

17
View観測に関する Tips potatotips #23 山下 大輔

Upload: daisuke-yamashita

Post on 14-Jan-2017

1.639 views

Category:

Engineering


2 download

TRANSCRIPT

Page 1: View Monitoring Tips

View観測に関するTips

potatotips #23 山下 大輔

Page 2: View Monitoring Tips

• 自己紹介 https://github.com/daisuke0131

• ビズリーチのiOSエンジニア

• https://github.com/daisuke0131/ViewMonitor を作っています。星ください。PR下さい。

Page 3: View Monitoring Tips

オープンソースライブラリ研究会 - iOS Android Rails編 -

http://connpass.com/event/22476/

TensorFlow研究会http://d-cube.connpass.com/event/23094/

勉強会はじめました

Page 4: View Monitoring Tips

What’s ViewMonitor

Page 5: View Monitoring Tips

開発初期段階でよくある風景

デザイナ

エンジニア

プロトタイプ レイアウト指示書

デザイン反映

比較配布

テスター (チームメンバ)

フィードバック

Page 6: View Monitoring Tips

ポテトチップスについて

レイアウト指示書 実際の実装(テスト配布アプリ)

比較

60×60

8

こういう状況で問題点をみつけないといけない

14pt #0000008

ポテトチップスはしお味よりものりしお味を選ぶ傾向にあります。コンソメ味も捨てがたいですがのりしお味が食べたい。

ポテトチップスについて

ポテトチップスはしお味よりものりしお味を選ぶ傾向にあります。コンソメ味も捨てがたいですがのりしお味が食べたい。

13pt #0000008

背景 #FFFFFF

Page 7: View Monitoring Tips

import ViewMonitor

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

ViewMonitor.start() return true

}

・1line execution

->色々設定しないと使えないアプリはめんどい(引数たくさん渡すとか)

Page 8: View Monitoring Tips

method swizzling

extension UIViewController{ class func monitor_methodSwizzling_didAppearWillDisappear() { monitor_methodSwizzling_exchange(fromSelector: "viewDidAppear:", toSelector: "monitor_methodSwizzling_viewDidAppear:") } private class func monitor_methodSwizzling_exchange(fromSelector fromSelector: Selector, toSelector: Selector) { let fromMethod = class_getInstanceMethod(UIViewController.self, fromSelector) let toMethod = class_getInstanceMethod(UIViewController.self, toSelector) method_exchangeImplementations(fromMethod, toMethod) } func monitor_methodSwizzling_viewDidAppear(animated: Bool) { monitor_methodSwizzling_viewDidAppear(animated) ViewMonitor.detectedViewDidAppear(self) } }

->viewの描画イベントをフックする必要がある。

Page 9: View Monitoring Tips

view view

観測対象のviewをマークングしてタップを検出したい。

x:100 y:100

Page 10: View Monitoring Tips

view view

観測対象のviewをマークングしてタップを検出したい。

x:100 y:100

->アプリのkeyWindowから再帰的に子のviewを取得->UIbuttonを配置して対象のviewにaddSubview ->UIButton自体に重ねたviewのオブジェクトを所有させる

Page 11: View Monitoring Tips

ボタン押せなくなる問題

viewuserInteractionEnabled = false

に設定されているとその上のview のタップが取得できない。

Page 12: View Monitoring Tips

ボタン押せなくなる問題

viewuserInteractionEnabled = false

に設定されているとその上のview のタップが取得できない。

->一旦userInteractionEnabledをtrueに設定しなおして オブジェクトの参照を保持する。機能リセット時に元の状態に 戻す。

Page 13: View Monitoring Tips
Page 14: View Monitoring Tips

Objective C対応をする

Page 15: View Monitoring Tips

Objective C対応をする

pure swift。。。

Page 16: View Monitoring Tips
Page 17: View Monitoring Tips

いけてないところ

->cocoaPodsでstoryboardの利用がうまくいかずコードで無理くり 画面実装。 ->実際に目に見えないviewもたくさん存在しているので対象のview Object を絞った。

やったら面白そうだなと思っていること

->injectionとreplace(挿入と置き換え) ->UILabelを実行時に動的に書き換えたり、新しいviewを挿入するなどして  簡易的にレイアウトをいじれるようにしたら面白そう。