forked from organicmaps/organicmaps
[MAPSME-4306] [ios] Fixed Mopub+Facebook banners support.
This commit is contained in:
parent
5ecc6d9bdb
commit
1dec2bc2d9
4 changed files with 48 additions and 17 deletions
|
@ -3,7 +3,6 @@
|
|||
|
||||
@interface MPNativeAd (MWM) <MPNativeViewDelegate>
|
||||
|
||||
- (void)setAdView:(UIView *)view;
|
||||
- (void)setActionButtons:(NSArray<UIButton *> *)buttons;
|
||||
- (void)setAdView:(UIView *)view actionButtons:(NSArray<UIButton *> *)buttons;
|
||||
|
||||
@end
|
||||
|
|
|
@ -1,34 +1,50 @@
|
|||
#import "FacebookNativeAdAdapter.h"
|
||||
#import "MPNativeAd+MWM.h"
|
||||
#import "SwiftBridge.h"
|
||||
|
||||
@interface MPNativeAd ()
|
||||
|
||||
@property (nonatomic) MPNativeView * associatedView;
|
||||
@property (nonatomic) BOOL hasAttachedToView;
|
||||
@property(nonatomic) MPNativeView * associatedView;
|
||||
@property(nonatomic) BOOL hasAttachedToView;
|
||||
@property(nonatomic, readonly) id<MPNativeAdAdapter> adAdapter;
|
||||
|
||||
- (void)willAttachToView:(UIView *)view;
|
||||
- (void)adViewTapped;
|
||||
- (void)nativeViewWillMoveToSuperview:(UIView *)superview;
|
||||
- (UIViewController *)viewControllerForPresentingModalView;
|
||||
|
||||
@end
|
||||
|
||||
@interface FacebookNativeAdAdapter ()
|
||||
|
||||
@property(nonatomic, readonly) FBNativeAd * fbNativeAd;
|
||||
|
||||
@end
|
||||
|
||||
@implementation MPNativeAd (MWM)
|
||||
|
||||
- (void)setAdView:(UIView *)view
|
||||
- (void)setAdView:(UIView *)view actionButtons:(NSArray<UIButton *> *)buttons
|
||||
{
|
||||
self.associatedView = static_cast<MPNativeView *>(view);
|
||||
static_cast<MWMAdBanner *>(view).mpNativeAd = self;
|
||||
if (!self.hasAttachedToView) {
|
||||
[self willAttachToView:self.associatedView];
|
||||
if ([self.adAdapter isKindOfClass:[FacebookNativeAdAdapter class]])
|
||||
{
|
||||
auto fbAdapter = static_cast<FacebookNativeAdAdapter *>(self.adAdapter);
|
||||
[fbAdapter.fbNativeAd registerViewForInteraction:self.associatedView
|
||||
withViewController:[self viewControllerForPresentingModalView]
|
||||
withClickableViews:buttons];
|
||||
}
|
||||
else
|
||||
{
|
||||
[self willAttachToView:self.associatedView];
|
||||
for (UIButton * button in buttons)
|
||||
[button addTarget:self
|
||||
action:@selector(adViewTapped)
|
||||
forControlEvents:UIControlEventTouchUpInside];
|
||||
}
|
||||
self.hasAttachedToView = YES;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setActionButtons:(NSArray<UIButton *> *)buttons
|
||||
{
|
||||
for (UIButton * button in buttons)
|
||||
[button addTarget:self action:@selector(adViewTapped) forControlEvents:UIControlEventTouchUpInside];
|
||||
}
|
||||
|
||||
@end
|
||||
|
|
|
@ -39,11 +39,13 @@ final class AdBanner: UITableViewCell {
|
|||
@IBOutlet private weak var adBodyLabel: UILabel!
|
||||
@IBOutlet private weak var adCallToActionButtonCompact: UIButton!
|
||||
@IBOutlet private weak var adCallToActionButtonDetailed: UIButton!
|
||||
@IBOutlet private weak var adCallToActionButtonCustom: UIButton!
|
||||
@IBOutlet private weak var adPrivacyButton: UIButton!
|
||||
static let detailedBannerExcessHeight: Float = 36
|
||||
|
||||
var state = AdBannerState.unset {
|
||||
didSet {
|
||||
guard state != .unset else { return }
|
||||
let config = state.config()
|
||||
adTitleLabel.numberOfLines = config.numberOfTitleLines
|
||||
adBodyLabel.numberOfLines = config.numberOfBodyLines
|
||||
|
@ -75,6 +77,7 @@ final class AdBanner: UITableViewCell {
|
|||
func reset() {
|
||||
state = .unset
|
||||
adPrivacyButton.isHidden = true
|
||||
adCallToActionButtonCustom.isHidden = true
|
||||
}
|
||||
|
||||
func config(ad: MWMBanner, containerType: AdBannerContainerType) {
|
||||
|
@ -176,10 +179,16 @@ final class AdBanner: UITableViewCell {
|
|||
|
||||
private func configMopubBanner(ad: MopubBanner) {
|
||||
mpNativeAd = ad.nativeAd
|
||||
mpNativeAd?.setAdView(self)
|
||||
|
||||
let adCallToActionButtons = [adCallToActionButtonCompact!, adCallToActionButtonDetailed!]
|
||||
mpNativeAd?.setActionButtons(adCallToActionButtons)
|
||||
let adCallToActionButtons: [UIButton]
|
||||
if state == .search {
|
||||
adCallToActionButtonCustom.isHidden = false
|
||||
adCallToActionButtons = [adCallToActionButtonCustom]
|
||||
} else {
|
||||
adCallToActionButtons = [adCallToActionButtonCompact, adCallToActionButtonDetailed]
|
||||
adCallToActionButtons.forEach { $0.setTitle(ad.ctaText, for: .normal) }
|
||||
}
|
||||
mpNativeAd?.setAdView(self, actionButtons: adCallToActionButtons)
|
||||
|
||||
let paragraphStyle = NSMutableParagraphStyle()
|
||||
paragraphStyle.firstLineHeadIndent = 24
|
||||
|
@ -193,8 +202,6 @@ final class AdBanner: UITableViewCell {
|
|||
if let url = URL(string: ad.iconURL) {
|
||||
adIconImageView.af_setImage(withURL: url)
|
||||
}
|
||||
|
||||
adCallToActionButtons.forEach { $0.setTitle(ad.ctaText, for: .normal) }
|
||||
adPrivacyButton.isHidden = ad.privacyInfoURL == nil
|
||||
}
|
||||
|
||||
|
|
|
@ -107,6 +107,10 @@
|
|||
<userDefinedRuntimeAttribute type="string" keyPath="textColorName" value="blackSecondaryText"/>
|
||||
</userDefinedRuntimeAttributes>
|
||||
</button>
|
||||
<button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="54O-iN-1Gg">
|
||||
<rect key="frame" x="0.0" y="0.0" width="375" height="109.5"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
</button>
|
||||
<button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="roundedRect" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="So8-wM-Cgz">
|
||||
<rect key="frame" x="14" y="8" width="24" height="16"/>
|
||||
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
|
||||
|
@ -122,11 +126,13 @@
|
|||
<constraint firstItem="NKM-3R-3g1" firstAttribute="top" relation="greaterThanOrEqual" secondItem="EuF-Rm-DHQ" secondAttribute="bottom" constant="8" id="Fjs-IQ-LQv"/>
|
||||
<constraint firstItem="Ev3-yY-ql1" firstAttribute="top" secondItem="kIR-cO-v6L" secondAttribute="bottom" priority="250" constant="8" id="HHb-Vh-rIl"/>
|
||||
<constraint firstItem="EuF-Rm-DHQ" firstAttribute="trailing" secondItem="f76-qn-ne4" secondAttribute="leading" priority="500" id="HLI-Zw-ETh"/>
|
||||
<constraint firstItem="54O-iN-1Gg" firstAttribute="top" secondItem="f76-qn-ne4" secondAttribute="top" id="JWc-kJ-RaK"/>
|
||||
<constraint firstItem="EuF-Rm-DHQ" firstAttribute="top" secondItem="f76-qn-ne4" secondAttribute="top" constant="8" id="KEp-1t-yK0"/>
|
||||
<constraint firstItem="NKM-3R-3g1" firstAttribute="leading" secondItem="f76-qn-ne4" secondAttribute="leading" id="Ls8-rz-N1Q"/>
|
||||
<constraint firstItem="Ev3-yY-ql1" firstAttribute="top" secondItem="kIR-cO-v6L" secondAttribute="bottom" priority="700" constant="4" id="NmE-r2-ZNA"/>
|
||||
<constraint firstAttribute="trailing" secondItem="kIR-cO-v6L" secondAttribute="trailing" priority="250" constant="16" id="POq-M6-rLU"/>
|
||||
<constraint firstItem="zWu-Gh-Vf7" firstAttribute="top" secondItem="kIR-cO-v6L" secondAttribute="top" constant="2" id="Q0s-7L-aih"/>
|
||||
<constraint firstAttribute="trailing" secondItem="54O-iN-1Gg" secondAttribute="trailing" id="S6I-ea-HJN"/>
|
||||
<constraint firstItem="9qA-JC-fkn" firstAttribute="leading" secondItem="Ev3-yY-ql1" secondAttribute="trailing" priority="500" constant="4" id="YNA-Lu-LXQ"/>
|
||||
<constraint firstItem="kIR-cO-v6L" firstAttribute="leading" secondItem="zWu-Gh-Vf7" secondAttribute="leading" id="ZVP-Gs-m00"/>
|
||||
<constraint firstAttribute="trailing" secondItem="NKM-3R-3g1" secondAttribute="trailing" id="ZiW-Tk-SOB"/>
|
||||
|
@ -136,9 +142,11 @@
|
|||
<constraint firstItem="Ev3-yY-ql1" firstAttribute="trailing" secondItem="kIR-cO-v6L" secondAttribute="trailing" id="eM3-Nv-zVj"/>
|
||||
<constraint firstItem="So8-wM-Cgz" firstAttribute="top" secondItem="zWu-Gh-Vf7" secondAttribute="top" constant="-2" id="fNs-FC-pga"/>
|
||||
<constraint firstItem="EuF-Rm-DHQ" firstAttribute="leading" secondItem="f76-qn-ne4" secondAttribute="leading" priority="250" constant="16" id="gJI-DA-6rn"/>
|
||||
<constraint firstItem="54O-iN-1Gg" firstAttribute="leading" secondItem="f76-qn-ne4" secondAttribute="leading" id="ge7-AI-110"/>
|
||||
<constraint firstItem="NKM-3R-3g1" firstAttribute="top" secondItem="Ev3-yY-ql1" secondAttribute="bottom" constant="8" id="hn7-T4-7Zo"/>
|
||||
<constraint firstAttribute="bottom" secondItem="NKM-3R-3g1" secondAttribute="bottom" priority="250" id="hzn-4Y-A0H"/>
|
||||
<constraint firstItem="So8-wM-Cgz" firstAttribute="leading" secondItem="zWu-Gh-Vf7" secondAttribute="leading" constant="-2" id="sAg-zL-vMW"/>
|
||||
<constraint firstAttribute="bottom" secondItem="54O-iN-1Gg" secondAttribute="bottom" id="tOj-8H-AsH"/>
|
||||
<constraint firstItem="Ev3-yY-ql1" firstAttribute="leading" secondItem="zWu-Gh-Vf7" secondAttribute="leading" id="tVH-Tk-6D6"/>
|
||||
<constraint firstItem="9qA-JC-fkn" firstAttribute="top" secondItem="f76-qn-ne4" secondAttribute="top" constant="18" id="u8g-fp-l2o"/>
|
||||
<constraint firstItem="zWu-Gh-Vf7" firstAttribute="leading" secondItem="f76-qn-ne4" secondAttribute="leading" priority="600" constant="16" id="vlX-zx-nfP"/>
|
||||
|
@ -154,6 +162,7 @@
|
|||
<outlet property="adBodyLabel" destination="Ev3-yY-ql1" id="xw6-9k-OYn"/>
|
||||
<outlet property="adCallToActionButtonCompact" destination="9qA-JC-fkn" id="2AF-5i-Wey"/>
|
||||
<outlet property="adCallToActionButtonCompactLeading" destination="5CH-Fo-S70" id="Vdl-uS-6Gd"/>
|
||||
<outlet property="adCallToActionButtonCustom" destination="54O-iN-1Gg" id="vvO-p7-eBA"/>
|
||||
<outlet property="adCallToActionButtonDetailed" destination="NKM-3R-3g1" id="diP-AI-tNi"/>
|
||||
<outlet property="adIconImageView" destination="EuF-Rm-DHQ" id="Edf-Ak-VAy"/>
|
||||
<outlet property="adPrivacyButton" destination="So8-wM-Cgz" id="tY6-tl-gGx"/>
|
||||
|
|
Loading…
Add table
Reference in a new issue