[MAPSME-4306] [ios] Fixed Mopub+Facebook banners support.

This commit is contained in:
Ilya Grechuhin 2017-04-18 10:35:30 +03:00 committed by Sergey Yershov
parent 5ecc6d9bdb
commit 1dec2bc2d9
4 changed files with 48 additions and 17 deletions

View file

@ -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

View file

@ -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

View file

@ -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
}

View file

@ -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"/>