@@ -48,10 +48,11 @@ public class TeadsWebViewHelper: NSObject, WKScriptMessageHandler {
4848 // only webView.scrollView should retain adView as subView
4949 weak var adView : UIView ?
5050
51- var adOpportunityTrackerView : TeadsAdOpportunityTrackerView ?
52-
5351 private var adViewConstraints = [ NSLayoutConstraint] ( )
5452
53+ // latest slot position updated
54+ private var slotPosition : SlotPosition ?
55+
5556 // width of element in Web content, needed to compute ratio
5657 public var adViewHTMLElementWidth : CGFloat = 0
5758
@@ -61,6 +62,7 @@ public class TeadsWebViewHelper: NSObject, WKScriptMessageHandler {
6162 private var isJsReady = false
6263
6364 private var slotOpenner : ( ( ) -> Void ) ?
65+ private var slotPositionAvailable : ( ( WKWebView , SlotPosition ) -> Void ) ?
6466
6567 /// Init the Teads webView helper
6668 ///
@@ -141,7 +143,6 @@ public class TeadsWebViewHelper: NSObject, WKScriptMessageHandler {
141143 self ? . noSlotTimer? . invalidate ( )
142144 }
143145 self ? . slotOpenner ? ( )
144- self ? . slotOpenner = nil
145146 }
146147 }
147148
@@ -167,9 +168,6 @@ public class TeadsWebViewHelper: NSObject, WKScriptMessageHandler {
167168 self . adView? . removeFromSuperview ( )
168169
169170 self . adView = adView
170- if let adOpportunityTrackerView = self . adOpportunityTrackerView {
171- self . adView? . addSubview ( adOpportunityTrackerView)
172- }
173171 self . webView? . scrollView. addSubview ( adView)
174172 self . adView? . translatesAutoresizingMaskIntoConstraints = false
175173
@@ -286,8 +284,14 @@ public class TeadsWebViewHelper: NSObject, WKScriptMessageHandler {
286284 /// - position: top/bottom/right/left position of the slot
287285 private func updateAdViewPosition( position: SlotPosition ) {
288286 adViewHTMLElementWidth = position. right - position. left
289- guard let adView = self . adView,
290- let webView = self . webView else {
287+ slotPosition = position
288+
289+ guard let webView = self . webView else {
290+ return
291+ }
292+ slotPositionAvailable ? ( webView, position)
293+
294+ guard let adView = self . adView else {
291295 return
292296 }
293297 let adViewHTMLElementHeight = position. bottom - position. top
@@ -309,12 +313,36 @@ public class TeadsWebViewHelper: NSObject, WKScriptMessageHandler {
309313 adViewConstraints. append ( adView. topAnchor. constraint ( equalTo: webView. scrollView. topAnchor, constant: position. top) )
310314
311315 if shouldUpdateAdViewFrame {
312- adViewConstraints. append ( adView. widthAnchor. constraint ( equalToConstant: adViewHTMLElementWidth) )
316+ adViewConstraints. append ( adView. widthAnchor. constraint ( equalToConstant: adViewHTMLElementWidth) )
313317 adViewConstraints. append ( adView. heightAnchor. constraint ( equalToConstant: adViewHTMLElementHeight) )
314318 }
315319
316320 NSLayoutConstraint . activate ( adViewConstraints)
317-
321+ }
322+
323+ /// `adOpportunity` is a key metrics to evaluate the performance of your inventory. It builds the visibility score of your placement in publisher dashboards.
324+ ///
325+ /// - Parameters:
326+ /// - adOpportunityTrackerView: the view that will monitor your inventory
327+ ///
328+ @objc public func setAdOpportunityTrackerView( _ adOpportunityTrackerView: TeadsAdOpportunityTrackerView ) {
329+ slotPositionAvailable = { [ weak self] webView, position in
330+ adOpportunityTrackerView. frame = CGRect ( x: position. left, y: position. top, width: 1 , height: 1 )
331+ webView. scrollView. addSubview ( adOpportunityTrackerView)
332+
333+ adOpportunityTrackerView. translatesAutoresizingMaskIntoConstraints = false
334+
335+ adOpportunityTrackerView. topAnchor. constraint ( equalTo: webView. scrollView. topAnchor, constant: position. top) . isActive = true
336+ adOpportunityTrackerView. leadingAnchor. constraint ( equalTo: webView. scrollView. leadingAnchor, constant: position. left) . isActive = true
337+ adOpportunityTrackerView. widthAnchor. constraint ( equalToConstant: 1 ) . isActive = true
338+ adOpportunityTrackerView. heightAnchor. constraint ( equalToConstant: 1 ) . isActive = true
339+ self ? . slotPositionAvailable = nil
340+ }
341+ guard let position = slotPosition,
342+ let webView = webView else {
343+ return
344+ }
345+ slotPositionAvailable ? ( webView, position)
318346 }
319347}
320348
0 commit comments