MoPub 如何使用具有动态单元格高度的 MPTableViewAdPlacer 实现 iOS 原生广告?
MoPub How to implement iOS Native Ads using MPTableViewAdPlacer with dynamic cell height?
我正在使用 MPTableViewAdPlacer 在 iOS UITableView 中实现原生广告。初始化 MPTableViewAdPlacer 时,它会请求 MPStaticNativeAdRendererSettings,这需要实现 viewSizeHandler。但是,这是在获取任何广告之前,正如名称所建议的那样 "Static" 原生广告。我正在尝试实现一个在获取 adData 后可以计算单元格高度的方法,例如标题、图像等。我一直在尝试寻找一种方法来实现动态单元格高度,但所有示例应用程序,Twitter 提供的说明仅显示静态高度实现。
代码如下:
-(void)setupAdPlacer {
MPNativeAdRequestTargeting *targeting = [MPNativeAdRequestTargeting targeting];
targeting.location = [[CLLocationManager alloc] init].location;
targeting.desiredAssets = [NSSet setWithObjects: kAdMainImageKey, kAdCTATextKey, kAdTextKey, kAdTitleKey, nil];
MPStaticNativeAdRendererSettings *settings = [[MPStaticNativeAdRendererSettings alloc] init];
settings.renderingViewClass = [REPostListViewMoPubAdCell class];
settings.viewSizeHandler = ^(CGFloat maximumWidth) {
return CGSizeMake(maximumWidth, 312.0);
// STATIC HEIGHT
};
MPNativeAdRendererConfiguration *config = [MPStaticNativeAdRenderer rendererConfigurationWithRendererSettings:settings];
self.adPlacer = [MPTableViewAdPlacer placerWithTableView:self.tableView viewController:self adPositioning:positioning rendererConfigurations:@[config]];
self.adPlacer.delegate = self;
[self.adPlacer loadAdsForAdUnitID:@"xxxxxxxxxxx" targeting:targeting];
}
你需要根据你的screen和tableview来决定高度和宽度。我已经在运行时设置了所有组件并且运行良好。
我正在使用设置 mopub。
-(void)setUpMopPubAd
{
MPServerAdPositioning *positioning = [[MPServerAdPositioning alloc] init];
self.placer = [MPTableViewAdPlacer placerWithTableView:tableViewContent viewController:self adPositioning:positioning defaultAdRenderingClass:[MoPubAdTableViewCell class]];
MPNativeAdRequestTargeting *targeting = [MPNativeAdRequestTargeting targeting]; targeting.desiredAssets = [NSSet setWithObjects:kAdIconImageKey, kAdMainImageKey, kAdCTATextKey, kAdTextKey, kAdTitleKey, nil];
[self.placer loadAdsForAdUnitID:kMoPubKey];
[tableViewContent mp_setDataSource:self];
[tableViewContent mp_setDelegate:self];
}
我已经为 MoPubAd 创建了 tableviewcell。
MoPubAdTableViewCell.h
@interface MoPubAdTableViewCell : UITableViewCell<MPNativeAdRendering>
@property (strong, nonatomic) IBOutlet UILabel *titleLabel;
@property (strong, nonatomic) IBOutlet UILabel *mainTextLabel;
@property (strong, nonatomic) IBOutlet UIButton *callToActionButton;
@property (strong, nonatomic) IBOutlet UIImageView *iconImageView;
@property (strong, nonatomic) IBOutlet UIImageView *mainImageView;
MoPubAdTableViewCell.m
@synthesize titleLabel, mainImageView, iconImageView, mainTextLabel,callToActionButton;
- (void)awakeFromNib
{
// Initialization code
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self)
{
UIView *viewBackground = [[UIView alloc]init];
[viewBackground.layer setMasksToBounds:YES];
[viewBackground.layer setBorderWidth:1.0];
[viewBackground.layer setBorderColor:[[UIColor colorWithRed:165.0/255.0 green:166.0/255.0 blue:167.0/255.0 alpha:1.0]CGColor]];
[viewBackground setBackgroundColor:[UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:0.2]];
if (iPhone4)
{
viewBackground.frame = CGRectMake(4, 4, [UIScreen mainScreen].bounds.size.width - 8 , 305 - 8 + 5);
}
else if (iPhone5)
{
viewBackground.frame = CGRectMake(4, 4, [UIScreen mainScreen].bounds.size.width - 8 , 305 - 8 + 5);
}
else if (iPhone6)
{
viewBackground.frame = CGRectMake(4, 4, [UIScreen mainScreen].bounds.size.width - 8 , 330 - 8 + 8);
}
else if (iPhone6Plus)
{
viewBackground.frame = CGRectMake(4, 4, [UIScreen mainScreen].bounds.size.width - 8 , 355 - 8 );
}
[self addSubview:viewBackground];
self.iconImageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 48, 48)];
// self.iconImageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 60, 60)];
[self.iconImageView.layer setMasksToBounds:YES];
self.iconImageView.layer.cornerRadius = 5.0;
[self addSubview:self.iconImageView];
self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(70, 10, 252, 25)];
[self.titleLabel setFont:[UIFont fontWithName:@"Roboto-Bold" size:15.0]];
[self.titleLabel setText:@"Title"];
[self.titleLabel setBackgroundColor:[UIColor clearColor]];
[self.titleLabel setAdjustsFontSizeToFitWidth:YES];
[self addSubview:self.titleLabel];
UILabel *lblSponsored = [[UILabel alloc]initWithFrame:CGRectMake(self.titleLabel.frame.origin.x, self.titleLabel.frame.origin.y + self.titleLabel.frame.size.height , self.titleLabel.frame.size.width, 20)];
lblSponsored.text = @"Sponsored";
lblSponsored.font = [UIFont fontWithName:@"Roboto-Regular" size:13.0];
[lblSponsored setTextAlignment:NSTextAlignmentLeft];
lblSponsored.textColor = [UIColor lightGrayColor];
[lblSponsored setBackgroundColor:[UIColor clearColor]];
[self addSubview:lblSponsored];
self.mainTextLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 65, [UIScreen mainScreen].bounds.size.width - 20, 35)];
[self.mainTextLabel setFont:[UIFont systemFontOfSize:14.0f]];
[self.mainTextLabel setBackgroundColor:[UIColor clearColor]];
[self.mainTextLabel setText:@"Text"];
[self.mainTextLabel setNumberOfLines:2];
[self addSubview:self.mainTextLabel];
self.mainImageView.contentMode = UIViewContentModeScaleAspectFit;
if (iPhone4 || iPhone5)
{
self.mainImageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, self.mainTextLabel.frame.size.height + self.mainTextLabel.frame.origin.y + 5, [UIScreen mainScreen].bounds.size.width - 20, 157)]; // 268
}
else if (iPhone6)
{
self.mainImageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, self.mainTextLabel.frame.size.height + self.mainTextLabel.frame.origin.y + 5, [UIScreen mainScreen].bounds.size.width - 20, 185)]; //320 260
}
else if (iPhone6Plus)
{
self.mainImageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, self.mainTextLabel.frame.size.height + self.mainTextLabel.frame.origin.y + 5, [UIScreen mainScreen].bounds.size.width - 20, 205)]; // 368
}
else
{
self.mainImageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, self.mainTextLabel.frame.size.height + self.mainTextLabel.frame.origin.y + 5, [UIScreen mainScreen].bounds.size.width - 20, 157)];
}
[self.mainImageView setClipsToBounds:YES];
// [self.mainImageView setContentMode:UIViewContentModeScaleAspectFill];
[self addSubview:self.mainImageView];
self.callToActionButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.callToActionButton setFrame:CGRectMake([UIScreen mainScreen].bounds.size.width - 105, self.mainImageView.frame.origin.y + self.mainImageView.frame.size.height + 5, 95, 30)];
[self.callToActionButton.titleLabel setAdjustsFontSizeToFitWidth:YES];
[self.callToActionButton.layer setMasksToBounds:YES];
// [self.callToActionButton.layer setBorderWidth:1.0];
[self.callToActionButton.layer setCornerRadius:5.0];
// [self.callToActionButton.layer setBorderColor:[[UIColor colorWithRed:165.0/255.0 green:166.0/255.0 blue:167.0/255.0 alpha:1.0]CGColor]];
[self.callToActionButton setBackgroundColor:[UIColor colorWithRed:0.0/255.0 green:158.0/255.0 blue:255.0/255.0 alpha:1.0]];
self.callToActionButton.userInteractionEnabled = NO;
[self addSubview:self.callToActionButton];
self.backgroundColor = [UIColor colorWithWhite:0 alpha:0.5f];
self.titleLabel.textColor = [UIColor colorWithWhite:0.86 alpha:1.0f];
self.mainTextLabel.textColor = [UIColor colorWithWhite:0.86 alpha:1.0f];
self.titleLabel.font = [UIFont fontWithName:@"Roboto-Bold" size:15.0];
self.mainTextLabel.font = [UIFont fontWithName:@"Roboto-Regular" size:13.0];
}
return self;
}
- (void)layoutAdAssets:(MPNativeAd *)adObject
{
[adObject loadTitleIntoLabel:self.titleLabel];
[adObject loadTextIntoLabel:self.mainTextLabel];
[adObject loadCallToActionTextIntoButton:self.callToActionButton];
// [adObject loadCallToActionTextIntoLabel:self.callToActionButton.titleLabel];
[adObject loadIconIntoImageView:self.iconImageView];
[adObject loadImageIntoImageView:self.mainImageView];
}
+ (CGSize)sizeWithMaximumWidth:(CGFloat)maximumWidth
{
if (iPhone4 || iPhone5)
{
return CGSizeMake(maximumWidth, 305 + 5);
}
else if (iPhone6)
{
return CGSizeMake(maximumWidth, 330 + 8);
}
else
{
return CGSizeMake(maximumWidth, 355 );
}
return CGSizeMake(maximumWidth, 295 + 15);
}
希望对您有所帮助。
注意:无论您使用哪种表视图方法,请在 ViewController 中使用带有 mp_
前缀的方法。
联系 Twitter 技术支持后,我确认目前 iOS 不支持动态单元格高度。唯一的方法是根据@Vatsal K 在他上面的评论中指出的最佳实践调整你的观点。
更新: 虽然下面的方法适用于现有的 MoPub Marketplace 适配器,但我在 MoPub 的 SDK 中发现了一个错误,该错误可能会导致其他适配器出现问题。具体来说,如果您使用此方法,则不会出现 Facebook 的隐私图标视图。 retrieveAdViewForSizeCalculationWithError
呼叫 retrieveViewWithAdapter
。这将实例化一个新的 adview 以用于调整大小(因此此方法也可能不是很有效)。当该方法将自定义网络适配器隐私视图添加为子视图时,问题就出现了。因为 MoPub 没有实例化一个新的适配器,所以适配器的隐私视图作为子视图添加到这个模板 adview 中,并从真正的 adview 中删除。小心行事。
我找到了解决方法,但它依赖于 MoPub SDK 接口未公开的常量。
如果你看MPStreamAdPlacer
- (CGSize)sizeForAd:(MPNativeAd *)ad withMaximumWidth:(CGFloat)maxWidth andIndexPath:(NSIndexPath *)indexPath
{
id<MPNativeAdRenderer> renderer = ad.renderer;
CGSize adSize;
if ([renderer respondsToSelector:@selector(viewSizeHandler)] && renderer.viewSizeHandler) {
adSize = [renderer viewSizeHandler](maxWidth);
if (adSize.height == MPNativeViewDynamicDimension) {
UIView *adView = [ad retrieveAdViewForSizeCalculationWithError:nil];
if (adView) {
CGSize hydratedAdViewSize = [adView sizeThatFits:CGSizeMake(adSize.width, CGFLOAT_MAX)];
return hydratedAdViewSize;
}
}
return adSize;
}
此方法由 MPTableViewAdPlacer 调用以获取广告的尺寸。它反过来使用您在配置放置器时设置的 viewSizeHandler。请注意,如果 returned 高度等于 MPNativeViewDynamicDimension
(-1.0),则它会回退到在广告视图上调用 -sizeThatFits:
。
此时已使用来自广告服务器的数据配置了广告视图,因此您可以实施 -sizeThatFits:
和 return 适合内容的尺寸:
// MoPub setup
MPStaticNativeAdRendererSettings *settings = [[MPStaticNativeAdRendererSettings alloc] init];
settings.renderingViewClass = [MyAdView class];
settings.viewSizeHandler = ^(CGFloat maxWidth) {
return CGSizeMake(maxWidth, -1.0);
};
MyAdView class:
- (CGSize)sizeThatFits:(CGSize)size {
// Inspect the configured labels and images to determine appropriate height for given size.width
CGFloat height = ...
return CGSizeMake(size.width, height);
}
警告
MPNativeViewDynamicDimension
是内部 MPStaticNativeAdRenderer,因此值和行为可能会更改,恕不另行通知。可能值得添加对链接的 SDK 版本的检查,如果它发生变化,则发出警告以检查实施是否仍然有效
我正在使用 MPTableViewAdPlacer 在 iOS UITableView 中实现原生广告。初始化 MPTableViewAdPlacer 时,它会请求 MPStaticNativeAdRendererSettings,这需要实现 viewSizeHandler。但是,这是在获取任何广告之前,正如名称所建议的那样 "Static" 原生广告。我正在尝试实现一个在获取 adData 后可以计算单元格高度的方法,例如标题、图像等。我一直在尝试寻找一种方法来实现动态单元格高度,但所有示例应用程序,Twitter 提供的说明仅显示静态高度实现。
代码如下:
-(void)setupAdPlacer {
MPNativeAdRequestTargeting *targeting = [MPNativeAdRequestTargeting targeting];
targeting.location = [[CLLocationManager alloc] init].location;
targeting.desiredAssets = [NSSet setWithObjects: kAdMainImageKey, kAdCTATextKey, kAdTextKey, kAdTitleKey, nil];
MPStaticNativeAdRendererSettings *settings = [[MPStaticNativeAdRendererSettings alloc] init];
settings.renderingViewClass = [REPostListViewMoPubAdCell class];
settings.viewSizeHandler = ^(CGFloat maximumWidth) {
return CGSizeMake(maximumWidth, 312.0);
// STATIC HEIGHT
};
MPNativeAdRendererConfiguration *config = [MPStaticNativeAdRenderer rendererConfigurationWithRendererSettings:settings];
self.adPlacer = [MPTableViewAdPlacer placerWithTableView:self.tableView viewController:self adPositioning:positioning rendererConfigurations:@[config]];
self.adPlacer.delegate = self;
[self.adPlacer loadAdsForAdUnitID:@"xxxxxxxxxxx" targeting:targeting];
}
你需要根据你的screen和tableview来决定高度和宽度。我已经在运行时设置了所有组件并且运行良好。
我正在使用设置 mopub。
-(void)setUpMopPubAd
{
MPServerAdPositioning *positioning = [[MPServerAdPositioning alloc] init];
self.placer = [MPTableViewAdPlacer placerWithTableView:tableViewContent viewController:self adPositioning:positioning defaultAdRenderingClass:[MoPubAdTableViewCell class]];
MPNativeAdRequestTargeting *targeting = [MPNativeAdRequestTargeting targeting]; targeting.desiredAssets = [NSSet setWithObjects:kAdIconImageKey, kAdMainImageKey, kAdCTATextKey, kAdTextKey, kAdTitleKey, nil];
[self.placer loadAdsForAdUnitID:kMoPubKey];
[tableViewContent mp_setDataSource:self];
[tableViewContent mp_setDelegate:self];
}
我已经为 MoPubAd 创建了 tableviewcell。
MoPubAdTableViewCell.h
@interface MoPubAdTableViewCell : UITableViewCell<MPNativeAdRendering>
@property (strong, nonatomic) IBOutlet UILabel *titleLabel;
@property (strong, nonatomic) IBOutlet UILabel *mainTextLabel;
@property (strong, nonatomic) IBOutlet UIButton *callToActionButton;
@property (strong, nonatomic) IBOutlet UIImageView *iconImageView;
@property (strong, nonatomic) IBOutlet UIImageView *mainImageView;
MoPubAdTableViewCell.m
@synthesize titleLabel, mainImageView, iconImageView, mainTextLabel,callToActionButton;
- (void)awakeFromNib
{
// Initialization code
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self)
{
UIView *viewBackground = [[UIView alloc]init];
[viewBackground.layer setMasksToBounds:YES];
[viewBackground.layer setBorderWidth:1.0];
[viewBackground.layer setBorderColor:[[UIColor colorWithRed:165.0/255.0 green:166.0/255.0 blue:167.0/255.0 alpha:1.0]CGColor]];
[viewBackground setBackgroundColor:[UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:0.2]];
if (iPhone4)
{
viewBackground.frame = CGRectMake(4, 4, [UIScreen mainScreen].bounds.size.width - 8 , 305 - 8 + 5);
}
else if (iPhone5)
{
viewBackground.frame = CGRectMake(4, 4, [UIScreen mainScreen].bounds.size.width - 8 , 305 - 8 + 5);
}
else if (iPhone6)
{
viewBackground.frame = CGRectMake(4, 4, [UIScreen mainScreen].bounds.size.width - 8 , 330 - 8 + 8);
}
else if (iPhone6Plus)
{
viewBackground.frame = CGRectMake(4, 4, [UIScreen mainScreen].bounds.size.width - 8 , 355 - 8 );
}
[self addSubview:viewBackground];
self.iconImageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 48, 48)];
// self.iconImageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 60, 60)];
[self.iconImageView.layer setMasksToBounds:YES];
self.iconImageView.layer.cornerRadius = 5.0;
[self addSubview:self.iconImageView];
self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(70, 10, 252, 25)];
[self.titleLabel setFont:[UIFont fontWithName:@"Roboto-Bold" size:15.0]];
[self.titleLabel setText:@"Title"];
[self.titleLabel setBackgroundColor:[UIColor clearColor]];
[self.titleLabel setAdjustsFontSizeToFitWidth:YES];
[self addSubview:self.titleLabel];
UILabel *lblSponsored = [[UILabel alloc]initWithFrame:CGRectMake(self.titleLabel.frame.origin.x, self.titleLabel.frame.origin.y + self.titleLabel.frame.size.height , self.titleLabel.frame.size.width, 20)];
lblSponsored.text = @"Sponsored";
lblSponsored.font = [UIFont fontWithName:@"Roboto-Regular" size:13.0];
[lblSponsored setTextAlignment:NSTextAlignmentLeft];
lblSponsored.textColor = [UIColor lightGrayColor];
[lblSponsored setBackgroundColor:[UIColor clearColor]];
[self addSubview:lblSponsored];
self.mainTextLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 65, [UIScreen mainScreen].bounds.size.width - 20, 35)];
[self.mainTextLabel setFont:[UIFont systemFontOfSize:14.0f]];
[self.mainTextLabel setBackgroundColor:[UIColor clearColor]];
[self.mainTextLabel setText:@"Text"];
[self.mainTextLabel setNumberOfLines:2];
[self addSubview:self.mainTextLabel];
self.mainImageView.contentMode = UIViewContentModeScaleAspectFit;
if (iPhone4 || iPhone5)
{
self.mainImageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, self.mainTextLabel.frame.size.height + self.mainTextLabel.frame.origin.y + 5, [UIScreen mainScreen].bounds.size.width - 20, 157)]; // 268
}
else if (iPhone6)
{
self.mainImageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, self.mainTextLabel.frame.size.height + self.mainTextLabel.frame.origin.y + 5, [UIScreen mainScreen].bounds.size.width - 20, 185)]; //320 260
}
else if (iPhone6Plus)
{
self.mainImageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, self.mainTextLabel.frame.size.height + self.mainTextLabel.frame.origin.y + 5, [UIScreen mainScreen].bounds.size.width - 20, 205)]; // 368
}
else
{
self.mainImageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, self.mainTextLabel.frame.size.height + self.mainTextLabel.frame.origin.y + 5, [UIScreen mainScreen].bounds.size.width - 20, 157)];
}
[self.mainImageView setClipsToBounds:YES];
// [self.mainImageView setContentMode:UIViewContentModeScaleAspectFill];
[self addSubview:self.mainImageView];
self.callToActionButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.callToActionButton setFrame:CGRectMake([UIScreen mainScreen].bounds.size.width - 105, self.mainImageView.frame.origin.y + self.mainImageView.frame.size.height + 5, 95, 30)];
[self.callToActionButton.titleLabel setAdjustsFontSizeToFitWidth:YES];
[self.callToActionButton.layer setMasksToBounds:YES];
// [self.callToActionButton.layer setBorderWidth:1.0];
[self.callToActionButton.layer setCornerRadius:5.0];
// [self.callToActionButton.layer setBorderColor:[[UIColor colorWithRed:165.0/255.0 green:166.0/255.0 blue:167.0/255.0 alpha:1.0]CGColor]];
[self.callToActionButton setBackgroundColor:[UIColor colorWithRed:0.0/255.0 green:158.0/255.0 blue:255.0/255.0 alpha:1.0]];
self.callToActionButton.userInteractionEnabled = NO;
[self addSubview:self.callToActionButton];
self.backgroundColor = [UIColor colorWithWhite:0 alpha:0.5f];
self.titleLabel.textColor = [UIColor colorWithWhite:0.86 alpha:1.0f];
self.mainTextLabel.textColor = [UIColor colorWithWhite:0.86 alpha:1.0f];
self.titleLabel.font = [UIFont fontWithName:@"Roboto-Bold" size:15.0];
self.mainTextLabel.font = [UIFont fontWithName:@"Roboto-Regular" size:13.0];
}
return self;
}
- (void)layoutAdAssets:(MPNativeAd *)adObject
{
[adObject loadTitleIntoLabel:self.titleLabel];
[adObject loadTextIntoLabel:self.mainTextLabel];
[adObject loadCallToActionTextIntoButton:self.callToActionButton];
// [adObject loadCallToActionTextIntoLabel:self.callToActionButton.titleLabel];
[adObject loadIconIntoImageView:self.iconImageView];
[adObject loadImageIntoImageView:self.mainImageView];
}
+ (CGSize)sizeWithMaximumWidth:(CGFloat)maximumWidth
{
if (iPhone4 || iPhone5)
{
return CGSizeMake(maximumWidth, 305 + 5);
}
else if (iPhone6)
{
return CGSizeMake(maximumWidth, 330 + 8);
}
else
{
return CGSizeMake(maximumWidth, 355 );
}
return CGSizeMake(maximumWidth, 295 + 15);
}
希望对您有所帮助。
注意:无论您使用哪种表视图方法,请在 ViewController 中使用带有 mp_
前缀的方法。
联系 Twitter 技术支持后,我确认目前 iOS 不支持动态单元格高度。唯一的方法是根据@Vatsal K 在他上面的评论中指出的最佳实践调整你的观点。
更新: 虽然下面的方法适用于现有的 MoPub Marketplace 适配器,但我在 MoPub 的 SDK 中发现了一个错误,该错误可能会导致其他适配器出现问题。具体来说,如果您使用此方法,则不会出现 Facebook 的隐私图标视图。 retrieveAdViewForSizeCalculationWithError
呼叫 retrieveViewWithAdapter
。这将实例化一个新的 adview 以用于调整大小(因此此方法也可能不是很有效)。当该方法将自定义网络适配器隐私视图添加为子视图时,问题就出现了。因为 MoPub 没有实例化一个新的适配器,所以适配器的隐私视图作为子视图添加到这个模板 adview 中,并从真正的 adview 中删除。小心行事。
我找到了解决方法,但它依赖于 MoPub SDK 接口未公开的常量。
如果你看MPStreamAdPlacer
- (CGSize)sizeForAd:(MPNativeAd *)ad withMaximumWidth:(CGFloat)maxWidth andIndexPath:(NSIndexPath *)indexPath
{
id<MPNativeAdRenderer> renderer = ad.renderer;
CGSize adSize;
if ([renderer respondsToSelector:@selector(viewSizeHandler)] && renderer.viewSizeHandler) {
adSize = [renderer viewSizeHandler](maxWidth);
if (adSize.height == MPNativeViewDynamicDimension) {
UIView *adView = [ad retrieveAdViewForSizeCalculationWithError:nil];
if (adView) {
CGSize hydratedAdViewSize = [adView sizeThatFits:CGSizeMake(adSize.width, CGFLOAT_MAX)];
return hydratedAdViewSize;
}
}
return adSize;
}
此方法由 MPTableViewAdPlacer 调用以获取广告的尺寸。它反过来使用您在配置放置器时设置的 viewSizeHandler。请注意,如果 returned 高度等于 MPNativeViewDynamicDimension
(-1.0),则它会回退到在广告视图上调用 -sizeThatFits:
。
此时已使用来自广告服务器的数据配置了广告视图,因此您可以实施 -sizeThatFits:
和 return 适合内容的尺寸:
// MoPub setup
MPStaticNativeAdRendererSettings *settings = [[MPStaticNativeAdRendererSettings alloc] init];
settings.renderingViewClass = [MyAdView class];
settings.viewSizeHandler = ^(CGFloat maxWidth) {
return CGSizeMake(maxWidth, -1.0);
};
MyAdView class:
- (CGSize)sizeThatFits:(CGSize)size {
// Inspect the configured labels and images to determine appropriate height for given size.width
CGFloat height = ...
return CGSizeMake(size.width, height);
}
警告
MPNativeViewDynamicDimension
是内部 MPStaticNativeAdRenderer,因此值和行为可能会更改,恕不另行通知。可能值得添加对链接的 SDK 版本的检查,如果它发生变化,则发出警告以检查实施是否仍然有效