> For the complete documentation index, see [llms.txt](https://adpopcornssp.gitbook.io/ssp-sdk/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://adpopcornssp.gitbook.io/ssp-sdk/sdk/ios/ios-2.x.x/undefined-6/undefined.md).

# 네이티브 레이아웃 가이드

## 네이티브 레이아웃 기본 설정

네이티브 구성을 위한 기본 `AdPopcornSSPNativeAd`를 생성합니다.

#### 1)  xib 연동 방식 (StoryBoard 사용시)

* <mark style="color:red;">`AdPopcornSSPNativeAd`</mark>를 생성합니다.  \
  storyboard에 AdPopcornSSPNativeAd 영역 지정 후 아래 스크린샷과 같이 Outlet 연결합니다.

<figure><img src="/files/PibEBPoliHexc0LqITcZ" alt="" width="563"><figcaption></figcaption></figure>

* **AdPopocrnSSP Native xib** 를 통해 손 쉽게 연동 작업을 진행하세요.

{% file src="/files/MD5nifcA96QzEWkJZ8qq" %}

* xib 연동을 위한 Code를 전달드립니다.

<details>

<summary><strong>Objective-C 연동 코드</strong></summary>

**.h**

```objective-c
#import <UIKit/UIKit.h>

@interface AdPopcornSSPNativeXibController : UIViewController
@end
```

**.m**

```objective-c

#import "AdPopcornSSPNativeXibController.h"
#import "AdPopcornSSPNativeAd.h"

@interface AdPopcornSSPNativeXibController () <APSSPNativeAdDelegate>
{}

@property (strong, nonatomic) IBOutlet AdPopcornSSPNativeAd *adPopcornSSPNativeAd;

// APSSP NativeAd View
@property (strong, nonatomic) IBOutlet UIView *apSSPNativeAdView;
@property (strong, nonatomic) IBOutlet UIImageView *apSSPIconImageView;
@property (strong, nonatomic) IBOutlet UIImageView *apSSPMainImageView;
@property (strong, nonatomic) IBOutlet UILabel *apSSPTitleView;
@property (strong, nonatomic) IBOutlet UILabel *apSSPDescView;
@property (strong, nonatomic) IBOutlet UILabel *apSSPCTAView;
@property (weak, nonatomic) IBOutlet UIButton *apSSPCTAButton;

@end

@implementation AdPopcornSSPNativeXibController

- (void)dealloc {
    NSLog(@"AdPopcornSSPNativeXibController dealloc");
}

- (void)viewDidLoad {
    [super viewDidLoad];

    // 1. AdPopcornSSPNativeAd 설정 (XIB에서 아울렛 연결됨)
    [_adPopcornSSPNativeAd noAdViewHidden:YES];
    _adPopcornSSPNativeAd.delegate = self;
    [_adPopcornSSPNativeAd setPlacementInfoWithAppKey:@"<APP_KEY>" placementId:@"<PLACEMENT_ID>" viewController:self];

    // 2. APSSPNativeAdRenderer 설정
    APSSPNativeAdRenderer *renderer = [[APSSPNativeAdRenderer alloc] init];
    renderer.apSSPNativeAdView = _apSSPNativeAdView;
    renderer.titleLabel = _apSSPTitleView;
    renderer.descLabel = _apSSPDescView;
    renderer.mainImageView = _apSSPMainImageView;
    renderer.iconImageView = _apSSPIconImageView;
    renderer.ctaButton = _apSSPCTAButton;
    renderer.ctaLabel = _apSSPCTAView;
    renderer.privacyIconCornerRadius = 10;
    renderer.privacyIconPosition = 1;
    renderer.privacyIconRightMargin = 20;
    renderer.privacyIconLeftMargin = 50;
    renderer.useTemplate = NO;
    renderer.templatePrivacyIconLeftMargin = 10;
    renderer.templatePrivacyIconRightMargin = 10;
    renderer.templatePrivacyIconTopMargin = 10;
    renderer.templatePrivacyIconBottomMargin = 10;
    [_adPopcornSSPNativeAd setApSSPRenderer:renderer superView:_apSSPNativeAdView];

    // 3. 광고 요청
    [_adPopcornSSPNativeAd loadRequest];
}

#pragma mark - APSSPNativeAdDelegate

- (void)APSSPNativeAdLoadSuccess:(AdPopcornSSPNativeAd *)nativeAd {
    NSLog(@"APSSPNativeAdLoadSuccess : %@, %@", nativeAd, [nativeAd getPlacementId]);
}

- (void)APSSPNativeAdLoadFail:(AdPopcornSSPNativeAd *)nativeAd error:(AdPopcornSSPError *)error {
    NSLog(@"APSSPNativeAdLoadFail");
}

- (void)APSSPNativeAdClicked:(AdPopcornSSPNativeAd *)nativeAd {
    NSLog(@"APSSPNativeAdClicked");
}

- (void)APSSPNativeAdImpression:(AdPopcornSSPNativeAd *)nativeAd {
    NSLog(@"APSSPNativeAdImpression");
}

- (void)APSSPNativeAdHidden:(AdPopcornSSPNativeAd *)nativeAd {
    NSLog(@"APSSPNativeAdHidden");
}

@end


```

</details>

<details>

<summary><strong>Swift xib 연동 코드</strong></summary>

```swift
import UIKit

class AdPopcornSSPNativeXibController: UIViewController, APSSPNativeAdDelegate {

    @IBOutlet private var adPopcornSSPNativeAd: AdPopcornSSPNativeAd!
    @IBOutlet private var apSSPNativeAdView: UIView!
    @IBOutlet private var apSSPIconImageView: UIImageView!
    @IBOutlet private var apSSPMainImageView: UIImageView!
    @IBOutlet private var apSSPTitleView: UILabel!
    @IBOutlet private var apSSPDescView: UILabel!
    @IBOutlet private var apSSPCTAView: UILabel!
    @IBOutlet private weak var apSSPCTAButton: UIButton!

    deinit {
        print("AdPopcornSSPNativeXibController deinit")
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // 1. SDK 설정
        adPopcornSSPNativeAd.noAdViewHidden(true)
        adPopcornSSPNativeAd.delegate = self
        adPopcornSSPNativeAd.setPlacementInfoWithAppKey( "<APP_KEY>", placementId: "<PLACEMENT_ID>", viewController: self)

        // 2. Renderer 설정
        let renderer = APSSPNativeAdRenderer()
        renderer.apSSPNativeAdView = apSSPNativeAdView
        renderer.titleLabel = apSSPTitleView
        renderer.descLabel = apSSPDescView
        renderer.mainImageView = apSSPMainImageView
        renderer.iconImageView = apSSPIconImageView
        renderer.ctaButton = apSSPCTAButton
        renderer.ctaLabel = apSSPCTAView
        renderer.privacyIconCornerRadius = 10
        renderer.privacyIconPosition = 1
        renderer.privacyIconRightMargin = 20
        renderer.privacyIconLeftMargin = 50
        renderer.useTemplate = false
        renderer.templatePrivacyIconLeftMargin = 10
        renderer.templatePrivacyIconRightMargin = 10
        renderer.templatePrivacyIconTopMargin = 10
        renderer.templatePrivacyIconBottomMargin = 10
        adPopcornSSPNativeAd.setApSSPRenderer(renderer, superView: apSSPNativeAdView)

        // 3. 광고 요청
        adPopcornSSPNativeAd.loadRequest()
    }

    // MARK: - APSSPNativeAdDelegate

    func apsspNativeAdLoadSuccess(_ nativeAd: AdPopcornSSPNativeAd) {
        print("APSSPNativeAdLoadSuccess: \(nativeAd), \(nativeAd.getPlacementId() ?? "")")
    }

    func apsspNativeAdLoadFail(_ nativeAd: AdPopcornSSPNativeAd, error: AdPopcornSSPError) {
        print("APSSPNativeAdLoadFail")
    }

    func apsspNativeAdClicked(_ nativeAd: AdPopcornSSPNativeAd) {
        print("APSSPNativeAdClicked")
    }

    func apsspNativeAdImpression(_ nativeAd: AdPopcornSSPNativeAd) {
        print("APSSPNativeAdImpression")
    }

    func apsspNativeAdHidden(_ nativeAd: AdPopcornSSPNativeAd) {
        print("APSSPNativeAdHidden")
    }
}

```

</details>

#### 2)  Code base 연동 방식

* Native 광고 화면을 Code로 만들고자 한다면 다음 코드를 활용해서 손쉽게 진행하세요.

<details>

<summary><strong>Objective-C</strong></summary>

.h

```objective-c
#import <UIKit/UIKit.h>

@interface AdPopcornSSPNativeCodeController : UIViewController
@end
```

.m

```objective-c
#import "AdPopcornSSPNativeCodeController.h"
#import "AdPopcornSSPNativeAd.h"


@interface AdPopcornSSPNativeCodeController () <APSSPNativeAdDelegate>
{}

@property (strong, nonatomic) AdPopcornSSPNativeAd *adPopcornSSPNativeAd;

// APSSP NativeAd View
@property (strong, nonatomic) UIView *apSSPNativeAdView;
@property (strong, nonatomic) UIImageView *apSSPIconImageView;
@property (strong, nonatomic) UIImageView *apSSPMainImageView;
@property (strong, nonatomic) UILabel *apSSPTitleView;
@property (strong, nonatomic) UILabel *apSSPDescView;
@property (strong, nonatomic) UILabel *apSSPCTAView;
@property (strong, nonatomic) UIButton *apSSPCTAButton;

@end


@implementation AdPopcornSSPNativeCodeController
- (void)dealloc {
    NSLog(@"AdPopcornSSPNativeCodeController dealloc");
}

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];

    // 1. AdPopcornSSPNativeAd 컨테이너 생성
    _adPopcornSSPNativeAd = [[AdPopcornSSPNativeAd alloc] initWithFrame:CGRectZero];
    _adPopcornSSPNativeAd.translatesAutoresizingMaskIntoConstraints = NO;
    _adPopcornSSPNativeAd.hidden = YES;
    [self.view addSubview:_adPopcornSSPNativeAd];


    [NSLayoutConstraint activateConstraints:@[
        [_adPopcornSSPNativeAd.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor constant:10],
        [_adPopcornSSPNativeAd.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor constant:-10],
        [_adPopcornSSPNativeAd.topAnchor constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor constant:20],
        [_adPopcornSSPNativeAd.heightAnchor constraintEqualToConstant:300]
    ]];

    // 2. apSSPNativeAdView (394x300 영역)
    _apSSPNativeAdView = [[UIView alloc] init];
    _apSSPNativeAdView.translatesAutoresizingMaskIntoConstraints = NO;
    [_adPopcornSSPNativeAd addSubview:_apSSPNativeAdView];

    [NSLayoutConstraint activateConstraints:@[
        [_apSSPNativeAdView.leadingAnchor constraintEqualToAnchor:_adPopcornSSPNativeAd.leadingAnchor],
        [_apSSPNativeAdView.trailingAnchor constraintEqualToAnchor:_adPopcornSSPNativeAd.trailingAnchor],
        [_apSSPNativeAdView.topAnchor constraintEqualToAnchor:_adPopcornSSPNativeAd.topAnchor],
        [_apSSPNativeAdView.bottomAnchor constraintEqualToAnchor:_adPopcornSSPNativeAd.bottomAnchor]
    ]];

    // 3. 아이콘 이미지 (80x80, 좌상단)
    _apSSPIconImageView = [[UIImageView alloc] init];
    _apSSPIconImageView.translatesAutoresizingMaskIntoConstraints = NO;
    _apSSPIconImageView.contentMode = UIViewContentModeScaleAspectFit;
    [_apSSPNativeAdView addSubview:_apSSPIconImageView];

    [NSLayoutConstraint activateConstraints:@[
        [_apSSPIconImageView.leadingAnchor constraintEqualToAnchor:_apSSPNativeAdView.leadingAnchor constant:8],
        [_apSSPIconImageView.topAnchor constraintEqualToAnchor:_apSSPNativeAdView.topAnchor constant:8],
        [_apSSPIconImageView.widthAnchor constraintEqualToConstant:80],
        [_apSSPIconImageView.heightAnchor constraintEqualToConstant:80]
    ]];

    // 4. 타이틀 라벨 (아이콘 오른쪽)
    _apSSPTitleView = [[UILabel alloc] init];
    _apSSPTitleView.translatesAutoresizingMaskIntoConstraints = NO;
    _apSSPTitleView.font = [UIFont boldSystemFontOfSize:15];
    _apSSPTitleView.numberOfLines = 1;
    [_apSSPNativeAdView addSubview:_apSSPTitleView];

    [NSLayoutConstraint activateConstraints:@[
        [_apSSPTitleView.leadingAnchor constraintEqualToAnchor:_apSSPIconImageView.trailingAnchor constant:8],
        [_apSSPTitleView.trailingAnchor constraintEqualToAnchor:_apSSPNativeAdView.trailingAnchor constant:-8],
        [_apSSPTitleView.topAnchor constraintEqualToAnchor:_apSSPIconImageView.topAnchor]
    ]];

    // 5. 설명 라벨 (타이틀 아래)
    _apSSPDescView = [[UILabel alloc] init];
    _apSSPDescView.translatesAutoresizingMaskIntoConstraints = NO;
    _apSSPDescView.font = [UIFont systemFontOfSize:13];
    _apSSPDescView.numberOfLines = 2;
    [_apSSPNativeAdView addSubview:_apSSPDescView];

    [NSLayoutConstraint activateConstraints:@[
        [_apSSPDescView.leadingAnchor constraintEqualToAnchor:_apSSPTitleView.leadingAnchor],
        [_apSSPDescView.trailingAnchor constraintEqualToAnchor:_apSSPTitleView.trailingAnchor],
        [_apSSPDescView.topAnchor constraintEqualToAnchor:_apSSPTitleView.bottomAnchor constant:4]
    ]];

    // 6. CTA 라벨 (설명 아래)
    _apSSPCTAView = [[UILabel alloc] init];
    _apSSPCTAView.translatesAutoresizingMaskIntoConstraints = NO;
    _apSSPCTAView.font = [UIFont systemFontOfSize:12];
    _apSSPCTAView.textColor = [UIColor grayColor];
    [_apSSPNativeAdView addSubview:_apSSPCTAView];

    [NSLayoutConstraint activateConstraints:@[
        [_apSSPCTAView.leadingAnchor constraintEqualToAnchor:_apSSPTitleView.leadingAnchor],
        [_apSSPCTAView.topAnchor constraintEqualToAnchor:_apSSPDescView.bottomAnchor constant:4]
    ]];

    // 7. CTA 버튼 (아이콘 아래, 좌측)
    _apSSPCTAButton = [UIButton buttonWithType:UIButtonTypeSystem];
    _apSSPCTAButton.translatesAutoresizingMaskIntoConstraints = NO;
    [_apSSPCTAButton setTitle:@"CTA" forState:UIControlStateNormal];
    _apSSPCTAButton.titleLabel.font = [UIFont boldSystemFontOfSize:14];
    [_apSSPNativeAdView addSubview:_apSSPCTAButton];

    [NSLayoutConstraint activateConstraints:@[
        [_apSSPCTAButton.leadingAnchor constraintEqualToAnchor:_apSSPNativeAdView.leadingAnchor constant:8],
        [_apSSPCTAButton.topAnchor constraintEqualToAnchor:_apSSPIconImageView.bottomAnchor constant:8],
        [_apSSPCTAButton.widthAnchor constraintEqualToConstant:80],
        [_apSSPCTAButton.heightAnchor constraintEqualToConstant:30]
    ]];

    // 8. 메인 이미지 (하단 영역)
    _apSSPMainImageView = [[UIImageView alloc] init];
    _apSSPMainImageView.translatesAutoresizingMaskIntoConstraints = NO;
    _apSSPMainImageView.contentMode = UIViewContentModeScaleAspectFit;
    [_apSSPNativeAdView addSubview:_apSSPMainImageView];

    [NSLayoutConstraint activateConstraints:@[
        [_apSSPMainImageView.leadingAnchor constraintEqualToAnchor:_apSSPNativeAdView.leadingAnchor constant:8],
        [_apSSPMainImageView.trailingAnchor constraintEqualToAnchor:_apSSPNativeAdView.trailingAnchor constant:-8],
        [_apSSPMainImageView.topAnchor constraintEqualToAnchor:_apSSPCTAButton.bottomAnchor constant:8],
        [_apSSPMainImageView.bottomAnchor constraintEqualToAnchor:_apSSPNativeAdView.bottomAnchor constant:-8]
    ]];

    // 9. AdPopcornSSPNativeAd 설정
    [_adPopcornSSPNativeAd noAdViewHidden:YES];
    _adPopcornSSPNativeAd.delegate = self;
    [_adPopcornSSPNativeAd setPlacementInfoWithAppKey:@"<APP_KEY>" placementId:@"<PLACEMENT_ID>" viewController:self];

    // 10. APSSPNativeAdRenderer 설정
    APSSPNativeAdRenderer *renderer = [[APSSPNativeAdRenderer alloc] init];
    renderer.apSSPNativeAdView = _apSSPNativeAdView;
    renderer.titleLabel = _apSSPTitleView;
    renderer.descLabel = _apSSPDescView;
    renderer.mainImageView = _apSSPMainImageView;
    renderer.iconImageView = _apSSPIconImageView;
    renderer.ctaButton = _apSSPCTAButton;
    renderer.ctaLabel = _apSSPCTAView;
    renderer.privacyIconCornerRadius = 10;
    renderer.privacyIconPosition = 1;
    renderer.privacyIconRightMargin = 20;
    renderer.privacyIconLeftMargin = 50;
    renderer.useTemplate = NO;
    renderer.templatePrivacyIconLeftMargin = 10;
    renderer.templatePrivacyIconRightMargin = 10;
    renderer.templatePrivacyIconTopMargin = 10;
    renderer.templatePrivacyIconBottomMargin = 10;
    [_adPopcornSSPNativeAd setApSSPRenderer:renderer superView:_apSSPNativeAdView];

    // 11. 광고 요청
    [_adPopcornSSPNativeAd loadRequest];
}


#pragma mark - APSSPNativeAdDelegate

- (void)APSSPNativeAdLoadSuccess:(AdPopcornSSPNativeAd *)nativeAd {
    NSLog(@"APSSPNativeAdLoadSuccess : %@, %@", nativeAd, [nativeAd getPlacementId]);
}

- (void)APSSPNativeAdLoadFail:(AdPopcornSSPNativeAd *)nativeAd error:(AdPopcornSSPError *)error {
    NSLog(@"APSSPNativeAdLoadFail");
}

- (void)APSSPNativeAdClicked:(AdPopcornSSPNativeAd *)nativeAd {
    NSLog(@"APSSPNativeAdClicked");
}

- (void)APSSPNativeAdImpression:(AdPopcornSSPNativeAd *)nativeAd {
    NSLog(@"APSSPNativeAdImpression");
}

- (void)APSSPNativeAdHidden:(AdPopcornSSPNativeAd *)nativeAd {
    NSLog(@"APSSPNativeAdHidden");
}

@end
```

</details>

<details>

<summary><strong>Swift</strong></summary>

```swift
import UIKit
import AdPopcornSSP

class AdPopcornSSPNativeCodeController: UIViewController, APSSPNativeAdDelegate {

    private var adPopcornSSPNativeAd: AdPopcornSSPNativeAd!
    private var apSSPNativeAdView: UIView!
    private var apSSPIconImageView: UIImageView!
    private var apSSPMainImageView: UIImageView!
    private var apSSPTitleView: UILabel!
    private var apSSPDescView: UILabel!
    private var apSSPCTAView: UILabel!
    private var apSSPCTAButton: UIButton!

    deinit {
        print("AdPopcornSSPNativeCodeController deinit")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white

        // 1. AdPopcornSSPNativeAd 컨테이너
        adPopcornSSPNativeAd = AdPopcornSSPNativeAd(frame: .zero)
        adPopcornSSPNativeAd.translatesAutoresizingMaskIntoConstraints = false
        adPopcornSSPNativeAd.isHidden = true
        view.addSubview(adPopcornSSPNativeAd)

        NSLayoutConstraint.activate([
            adPopcornSSPNativeAd.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10),
            adPopcornSSPNativeAd.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -10),
            adPopcornSSPNativeAd.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 20),
            adPopcornSSPNativeAd.heightAnchor.constraint(equalToConstant: 300)
        ])

        // 2. apSSPNativeAdView
        apSSPNativeAdView = UIView()
        apSSPNativeAdView.translatesAutoresizingMaskIntoConstraints = false
        adPopcornSSPNativeAd.addSubview(apSSPNativeAdView)

        NSLayoutConstraint.activate([
            apSSPNativeAdView.leadingAnchor.constraint(equalTo: adPopcornSSPNativeAd.leadingAnchor),
            apSSPNativeAdView.trailingAnchor.constraint(equalTo: adPopcornSSPNativeAd.trailingAnchor),
            apSSPNativeAdView.topAnchor.constraint(equalTo: adPopcornSSPNativeAd.topAnchor),
            apSSPNativeAdView.bottomAnchor.constraint(equalTo: adPopcornSSPNativeAd.bottomAnchor)
        ])

        // 3. 아이콘 (80x80)
        apSSPIconImageView = UIImageView()
        apSSPIconImageView.translatesAutoresizingMaskIntoConstraints = false
        apSSPIconImageView.contentMode = .scaleAspectFit
        apSSPNativeAdView.addSubview(apSSPIconImageView)

        NSLayoutConstraint.activate([
            apSSPIconImageView.leadingAnchor.constraint(equalTo: apSSPNativeAdView.leadingAnchor, constant: 8),
            apSSPIconImageView.topAnchor.constraint(equalTo: apSSPNativeAdView.topAnchor, constant: 8),
            apSSPIconImageView.widthAnchor.constraint(equalToConstant: 80),
            apSSPIconImageView.heightAnchor.constraint(equalToConstant: 80)
        ])

        // 4. 타이틀
        apSSPTitleView = UILabel()
        apSSPTitleView.translatesAutoresizingMaskIntoConstraints = false
        apSSPTitleView.font = .boldSystemFont(ofSize: 15)
        apSSPNativeAdView.addSubview(apSSPTitleView)

        NSLayoutConstraint.activate([
            apSSPTitleView.leadingAnchor.constraint(equalTo: apSSPIconImageView.trailingAnchor, constant: 8),
            apSSPTitleView.trailingAnchor.constraint(equalTo: apSSPNativeAdView.trailingAnchor, constant: -8),
            apSSPTitleView.topAnchor.constraint(equalTo: apSSPIconImageView.topAnchor)
        ])

        // 5. 설명
        apSSPDescView = UILabel()
        apSSPDescView.translatesAutoresizingMaskIntoConstraints = false
        apSSPDescView.font = .systemFont(ofSize: 13)
        apSSPDescView.numberOfLines = 2
        apSSPNativeAdView.addSubview(apSSPDescView)

        NSLayoutConstraint.activate([
            apSSPDescView.leadingAnchor.constraint(equalTo: apSSPTitleView.leadingAnchor),
            apSSPDescView.trailingAnchor.constraint(equalTo: apSSPTitleView.trailingAnchor),
            apSSPDescView.topAnchor.constraint(equalTo: apSSPTitleView.bottomAnchor, constant: 4)
        ])

        // 6. CTA 라벨
        apSSPCTAView = UILabel()
        apSSPCTAView.translatesAutoresizingMaskIntoConstraints = false
        apSSPCTAView.font = .systemFont(ofSize: 12)
        apSSPCTAView.textColor = .gray
        apSSPNativeAdView.addSubview(apSSPCTAView)

        NSLayoutConstraint.activate([
            apSSPCTAView.leadingAnchor.constraint(equalTo: apSSPTitleView.leadingAnchor),
            apSSPCTAView.topAnchor.constraint(equalTo: apSSPDescView.bottomAnchor, constant: 4)
        ])

        // 7. CTA 버튼
        apSSPCTAButton = UIButton(type: .system)
        apSSPCTAButton.translatesAutoresizingMaskIntoConstraints = false
        apSSPCTAButton.setTitle("CTA", for: .normal)
        apSSPCTAButton.titleLabel?.font = .boldSystemFont(ofSize: 14)
        apSSPNativeAdView.addSubview(apSSPCTAButton)

        NSLayoutConstraint.activate([
            apSSPCTAButton.leadingAnchor.constraint(equalTo: apSSPNativeAdView.leadingAnchor, constant: 8),
            apSSPCTAButton.topAnchor.constraint(equalTo: apSSPIconImageView.bottomAnchor, constant: 8),
            apSSPCTAButton.widthAnchor.constraint(equalToConstant: 80),
            apSSPCTAButton.heightAnchor.constraint(equalToConstant: 30)
        ])

        // 8. 메인 이미지
        apSSPMainImageView = UIImageView()
        apSSPMainImageView.translatesAutoresizingMaskIntoConstraints = false
        apSSPMainImageView.contentMode = .scaleAspectFit
        apSSPNativeAdView.addSubview(apSSPMainImageView)

        NSLayoutConstraint.activate([
            apSSPMainImageView.leadingAnchor.constraint(equalTo: apSSPNativeAdView.leadingAnchor, constant: 8),
            apSSPMainImageView.trailingAnchor.constraint(equalTo: apSSPNativeAdView.trailingAnchor, constant: -8),
            apSSPMainImageView.topAnchor.constraint(equalTo: apSSPCTAButton.bottomAnchor, constant: 8),
            apSSPMainImageView.bottomAnchor.constraint(equalTo: apSSPNativeAdView.bottomAnchor, constant: -8)
        ])

        // 9. SDK 설정
        adPopcornSSPNativeAd.noAdViewHidden(true)
        adPopcornSSPNativeAd.delegate = self
        adPopcornSSPNativeAd.setPlacementInfoWithAppKey( "<APP_KEY>", placementId: "<PLACEMENT_ID>", viewController: self)

        // 10. Renderer 설정
        let renderer = APSSPNativeAdRenderer()
        renderer.apSSPNativeAdView = apSSPNativeAdView
        renderer.titleLabel = apSSPTitleView
        renderer.descLabel = apSSPDescView
        renderer.mainImageView = apSSPMainImageView
        renderer.iconImageView = apSSPIconImageView
        renderer.ctaButton = apSSPCTAButton
        renderer.ctaLabel = apSSPCTAView
        renderer.privacyIconCornerRadius = 10
        renderer.privacyIconPosition = 1
        renderer.privacyIconRightMargin = 20
        renderer.privacyIconLeftMargin = 50
        renderer.useTemplate = false
        renderer.templatePrivacyIconLeftMargin = 10
        renderer.templatePrivacyIconRightMargin = 10
        renderer.templatePrivacyIconTopMargin = 10
        renderer.templatePrivacyIconBottomMargin = 10
        adPopcornSSPNativeAd.setApSSPRenderer(renderer, superView: apSSPNativeAdView)

        // 11. 광고 요청
        adPopcornSSPNativeAd.loadRequest()
    }

    // MARK: - APSSPNativeAdDelegate

    func apsspNativeAdLoadSuccess(_ nativeAd: AdPopcornSSPNativeAd) {
        print("APSSPNativeAdLoadSuccess: \(nativeAd), \(nativeAd.getPlacementId() ?? "")")
    }

    func apsspNativeAdLoadFail(_ nativeAd: AdPopcornSSPNativeAd, error: AdPopcornSSPError) {
        print("APSSPNativeAdLoadFail")
    }

    func apsspNativeAdClicked(_ nativeAd: AdPopcornSSPNativeAd) {
        print("APSSPNativeAdClicked")
    }

    func apsspNativeAdImpression(_ nativeAd: AdPopcornSSPNativeAd) {
        print("APSSPNativeAdImpression")
    }

    func apsspNativeAdHidden(_ nativeAd: AdPopcornSSPNativeAd) {
        print("APSSPNativeAdHidden")
    }
}

```

</details>

### Template 사용 방법

-> Template화 된 NativeAd를 사용하고 싶다면 다음과 같이 수정해 주시면 됩니다.

storyboard에서 생성한 Outlet 연결한 UI view를 <mark style="color:red;">`APSSPNativeAdRenderer`</mark>를 사용하여 sdk에 전달합니다.

storyboard에서 생성한 ui view를 APSSPNativeAdRenderer를 사용하여 sdk에 전달한다. 단, title, description, icon, main image, cta를 설정해 줄 필요 없이 최상위 view 전달과 useTemplate 값을 YES로 설정해 주시면 됩니다.

{% tabs %}
{% tab title="Objective-C" %}

```objectivec
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    APSSPNativeAdRenderer *apSSPNativeAdRenderer = [[APSSPNativeAdRenderer alloc] init];
    apSSPNativeAdRenderer.apSSPNativeAdView = _apSSPNativeAdView;
    apSSPNativeAdRenderer.useTemplate = YES;
    [_adPopcornSSPNativeAd setApSSPRenderer:apSSPNativeAdRenderer superView:_apSSPNativeAdView];
}
```

{% endtab %}

{% tab title="Swift" %}

```swift
override func viewDidLoad() 
{
    super.viewDidLoad()
    apSSPNativeAdRenderer = APSSPNativeAdRenderer.init()
    apSSPNativeAdRenderer.apSSPNativeAdView = apSSPNativeAdView
    apSSPNativeAdRenderer.useTemplate = true
    adPopcornSSPNativeAd.setApSSPRenderer(apSSPNativeAdRenderer, superView: apSSPNativeAdView)
}
```

{% endtab %}
{% endtabs %}

{% hint style="warning" %}
실제 구현 내용은 샘플 프로젝트를 통해 확인하시면 좀 더 쉽게 확인이 가능합니다.&#x20;

([샘플 프로젝트 내 NativeAdViewController.m 참고](/ssp-sdk/sdk/ios/ios-3.1.0+/undefined-13.md))
{% endhint %}

***

## 네이티브 미디에이션 레이아웃 설정

`AdPopcornSSPNativeAd`에 의해 관리될 미디에이션 네이티브 광고 영역을 연동합니다. 사용하고자 하는 업체만 연동하면 됩니다.

{% hint style="warning" %}
Max 미디에이션을 사용하는 경우, AppLovinMax 네이티브 레이아웃 설정만 진행하면 됩니다.
{% endhint %}

### AdPopcornSSP 네이티브 레이아웃 설정

위 "네이티브 레이아웃 기본 설정" 섹션의 `APSSPNativeAdRenderer` 설정을 참고하세요.

### 네이티브 레이아웃 설정

<details>

<summary><strong>NAM</strong> </summary>

{% hint style="info" %}
[GFPNativeAdView.xib 다운로드](#) — 해당 xib를 커스텀하여 사용하세요. **(mediaView, bodyLabel 연동 필수)**
{% endhint %}

NAM은 `GfpNativeAdView`(일반형)와 `GfpNativeSimpleAdView`(SimpleAd)를 동시에 지원합니다. \
두 가지를 함께 설정하면 더 많은 광고를 수신할 수 있습니다.

**네이티브 광고 뷰 생성 절차:**

1. xib를 만들고, Identity Inspector에서 Custom Class를 `GFPNativeAdView`로 설정
2. 각 에셋 뷰(title, body 등)를 만들고, Connections Inspector에서 `GFPNativeAdView`의 Outlet과 연결
3. mediaView는 Custom Class를 `GFPMediaView`로 설정

#### GfpNativeAdView + GfpNativeSimpleAdView (권장)

**Objective-C**

```objc
#import <AdPopcornSSP/AdPopcornSSPNativeAd.h>
#import "NAMAdapter.h"

- (void)viewDidLoad {
    [super viewDidLoad];

    CGFloat width = [UIScreen mainScreen].bounds.size.width;
    CGFloat xibHeight = round((width * 185) / 360 * 10) / 10;

    // SimpleAdView
    GFPNativeSimpleAdView *namNativeSimpleAdView = [[GFPNativeSimpleAdView alloc]
        initWithFrame:CGRectMake(0, 0, width, xibHeight)];

    // NativeAdView (xib)
    GFPNativeAdView *namNativeAdView =
        [[NSBundle mainBundle] loadNibNamed:@"GFPNativeAdView" owner:nil options:nil].firstObject;
    namNativeAdView.frame = CGRectMake(0, 0, width, xibHeight);

    APNAMNativeAdRenderer *renderer = [[APNAMNativeAdRenderer alloc] init];
    renderer.namNativeSimpleAdView = namNativeSimpleAdView;
    renderer.namNativeAdView = namNativeAdView;
    renderer.backgroundBlur = YES;
    renderer.namNativeSuperView = _adNAMNativeSuperView;
    [_adPopcornSSPNativeAd setNAMRenderer:renderer superView:_adNAMNativeSuperView];
}
```

**Swift**

```swift
let width = UIScreen.main.bounds.width
let xibHeight = round((width * 185) / 360 * 10) / 10

let namNativeSimpleAdView = GFPNativeSimpleAdView(
    frame: CGRect(x: 0, y: 0, width: width, height: xibHeight))

let namNativeAdView = Bundle.main.loadNibNamed("GFPNativeAdView",
                                                owner: nil,
                                                options: nil)?.first as? GFPNativeAdView
namNativeAdView?.frame = CGRect(x: 0, y: 0, width: width, height: xibHeight)

let renderer = APNAMNativeAdRenderer()
renderer.namNativeSimpleAdView = namNativeSimpleAdView
renderer.namNativeAdView = namNativeAdView
renderer.backgroundBlur = true
renderer.namNativeSuperView = adNAMNativeSuperView
adPopcornSSPNativeAd.setNAMRenderer(renderer, superView: adNAMNativeSuperView)
```

#### GfpNativeSimpleAdView 단독 사용

**Objective-C**

```objc
#import <AdPopcornSSP/AdPopcornSSPNativeAd.h>
#import "NAMAdapter.h"

- (void)viewDidLoad {
    [super viewDidLoad];

    CGFloat width = [UIScreen mainScreen].bounds.size.width;
    CGFloat xibHeight = round((width * 185) / 360 * 10) / 10;

    GFPNativeSimpleAdView *namNativeSimpleAdView = [[GFPNativeSimpleAdView alloc]
    initWithFrame:CGRectMake(0, 0, width, xibHeight)];

APNAMNativeAdRenderer *renderer = [[APNAMNativeAdRenderer alloc] init];
renderer.namNativeSimpleAdView = namNativeSimpleAdView;
renderer.namNativeSuperView = _adNAMNativeSuperView;
[_adPopcornSSPNativeAd setNAMRenderer:renderer superView:_adNAMNativeSuperView];

}
```

**Swift**

```swift
let width = UIScreen.main.bounds.width
let xibHeight = round((width * 185) / 360 * 10) / 10

let namNativeSimpleAdView = GFPNativeSimpleAdView(
    frame: CGRect(x: 0, y: 0, width: width, height: xibHeight))

let renderer = APNAMNativeAdRenderer()
renderer.namNativeSimpleAdView = namNativeSimpleAdView
renderer.namNativeSuperView = adNAMNativeSuperView
adPopcornSSPNativeAd.setNAMRenderer(renderer, superView: adNAMNativeSuperView)
```

#### GfpNativeAdView 단독 사용

**Objective-C**

```objc
#import <AdPopcornSSP/AdPopcornSSPNativeAd.h>
#import "NAMAdapter.h"

- (void)viewDidLoad {
    [super viewDidLoad];

    CGFloat width = [UIScreen mainScreen].bounds.size.width;
    CGFloat xibHeight = round((width * 185) / 360 * 10) / 10;

GFPNativeAdView *namNativeAdView =
    [[NSBundle mainBundle] loadNibNamed:@"GFPNativeAdView" owner:nil options:nil].firstObject;
namNativeAdView.frame = CGRectMake(0, 0, width, xibHeight);

APNAMNativeAdRenderer *renderer = [[APNAMNativeAdRenderer alloc] init];
renderer.namNativeAdView = namNativeAdView;
renderer.backgroundBlur = YES;
renderer.namNativeSuperView = _adNAMNativeSuperView;
[_adPopcornSSPNativeAd setNAMRenderer:renderer superView:_adNAMNativeSuperView];
}
```

**Swift**

```swift
let width = UIScreen.main.bounds.width
let xibHeight = round((width * 185) / 360 * 10) / 10

let namNativeAdView = Bundle.main.loadNibNamed("GFPNativeAdView",
                                                owner: nil,
                                                options: nil)?.first as? GFPNativeAdView
namNativeAdView?.frame = CGRect(x: 0, y: 0, width: width, height: xibHeight)

let renderer = APNAMNativeAdRenderer()
renderer.namNativeAdView = namNativeAdView
renderer.backgroundBlur = true
renderer.namNativeSuperView = adNAMNativeSuperView
adPopcornSSPNativeAd.setNAMRenderer(renderer, superView: adNAMNativeSuperView)
```

#### 네이티브 광고 중복 제어 (선택)

```objc
GFPDedupeManager *dedupeManager = [[GFPDedupeManager alloc] initWithSize:4];
renderer.namDedupeManager = dedupeManager;
```

동일한 `GFPDedupeManager`를 사용하는 지면은 중복 광고가 노출되지 않습니다.

</details>

<details>

<summary><strong>AdFit</strong></summary>

{% hint style="info" %}
[APSSPAdfitNativeAdView.xib 다운로드](#) — 해당 xib를 커스텀하여 사용하세요.
{% endhint %}

AdFit은 일반 네이티브와 BizBoard 두 가지 방식을 지원합니다.

#### 일반 네이티브

**Objective-C**

```objc
#import <AdPopcornSSP/AdPopcornSSPNativeAd.h>
#import "AdFitAdapter.h"

- (void)viewDidLoad {
    [super viewDidLoad];

    APSSPAdfitNativeAdView *adfitNativeAd =
        [[NSBundle mainBundle] loadNibNamed:@"APSSPAdfitNativeAdView" owner:nil options:nil].firstObject;
    adfitNativeAd.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 250);

    APAdFitNativeAdRenderer *renderer = [[APAdFitNativeAdRenderer alloc] init];
    renderer.useBizBoardTemplate = NO;
    renderer.adfitNativeAdUIView = adfitNativeAd;
    [_adPopcornSSPNativeAd setAdFitRenderer:renderer superView:adfitNativeAd];
}
```

**Swift**

```swift
let adfitNativeAd = Bundle.main.loadNibNamed("APSSPAdfitNativeAdView",
                                              owner: nil,
                                              options: nil)?.first as? APSSPAdfitNativeAdView
adfitNativeAd?.frame = CGRect(x: 0, y: 0,
                               width: UIScreen.main.bounds.width, height: 250)

let renderer = APAdFitNativeAdRenderer()
renderer.useBizBoardTemplate = false
renderer.adfitNativeAdUIView = adfitNativeAd
adPopcornSSPNativeAd.setAdFitRenderer(renderer, superView: adfitNativeAd)
```

#### BizBoard 방식

BizBoard는 별도 xib 없이 템플릿을 사용합니다.

**Objective-C**

```objc
AdFitBizBoardAdTemplateLayout *bizBoardTemplate = [[AdFitBizBoardAdTemplateLayout alloc]
    initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 0)];

APAdFitNativeAdRenderer *renderer = [[APAdFitNativeAdRenderer alloc] init];
renderer.adfitBizBoardTemplate = bizBoardTemplate;
renderer.bizBoardInfoIconTopConstant = 10;
renderer.bizBoardInfoIconRightConstant = -16;
[_adPopcornSSPNativeAd setAdFitRenderer:renderer superView:bizBoardTemplate];
```

**Swift**

```swift
let bizBoardTemplate = AdFitBizBoardAdTemplateLayout(
    frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 0))

let renderer = APAdFitNativeAdRenderer()
renderer.adfitBizBoardTemplate = bizBoardTemplate
renderer.bizBoardInfoIconTopConstant = 10
renderer.bizBoardInfoIconRightConstant = -16
adPopcornSSPNativeAd.setAdFitRenderer(renderer, superView: bizBoardTemplate)
```

</details>

<details>

<summary><strong>AdMob</strong></summary>

{% hint style="info" %}
[GADNativeAdView.xib 다운로드](#) — 해당 xib를 커스텀하여 사용하세요.
{% endhint %}

{% hint style="info" %}
UI 배치 관련 상세 가이드: [AdMob iOS Native 가이드](https://developers.google.com/admob/ios/native/advanced?hl=ko#code_example)
{% endhint %}

**Objective-C**

```objc
#import <AdPopcornSSP/AdPopcornSSPNativeAd.h>
#import "AdMobAdapter.h"

- (void)viewDidLoad {
    [super viewDidLoad];

    GADNativeAdView *admobNativeAdView =
        [[NSBundle mainBundle] loadNibNamed:@"GADNativeAdView" owner:nil options:nil].firstObject;

    APAdMobNativeAdRenderer *apAdMobNativeAdRenderer = [[APAdMobNativeAdRenderer alloc] init];
    apAdMobNativeAdRenderer.admobNativeAdView = admobNativeAdView;
    [_adPopcornSSPNativeAd setAdMobRenderer:apAdMobNativeAdRenderer superView:admobNativeAdView];
}
```

**Swift**

```swift
let admobNativeAdView = Bundle.main.loadNibNamed("GADNativeAdView",
                                                  owner: nil,
                                                  options: nil)?.first as? GADNativeAdView

let apAdMobNativeAdRenderer = APAdMobNativeAdRenderer()
apAdMobNativeAdRenderer.admobNativeAdView = admobNativeAdView
adPopcornSSPNativeAd.setAdMobRenderer(apAdMobNativeAdRenderer, superView: admobNativeAdView)
```

### GAM 네이티브 레이아웃 설정

GAM은 AdMob과 동일한 `GADNativeAdView.xib`를 사용합니다. Renderer만 `APGAMNativeAdRenderer`로 변경합니다.

**Objective-C**

```objc
GADNativeAdView *gamNativeAdView =
    [[NSBundle mainBundle] loadNibNamed:@"GADNativeAdView" owner:nil options:nil].firstObject;

APGAMNativeAdRenderer *apGAMNativeAdRenderer = [[APGAMNativeAdRenderer alloc] init];
apGAMNativeAdRenderer.gamNativeAdView = gamNativeAdView;
[_adPopcornSSPNativeAd setGAMRenderer:apGAMNativeAdRenderer superView:gamNativeAdView];
```

**Swift**

```swift
let gamNativeAdView = Bundle.main.loadNibNamed("GADNativeAdView",
                                                owner: nil,
                                                options: nil)?.first as? GADNativeAdView

let apGAMNativeAdRenderer = APGAMNativeAdRenderer()
apGAMNativeAdRenderer.gamNativeAdView = gamNativeAdView
adPopcornSSPNativeAd.setGAMRenderer(apGAMNativeAdRenderer, superView: gamNativeAdView)
```

</details>

<details>

<summary><strong>GAM</strong></summary>

GAM은 AdMob과 동일한 `GADNativeAdView.xib`를 사용합니다. Renderer만 `APGAMNativeAdRenderer`로 변경합니다.

**Objective-C**

```objc
#import <AdPopcornSSP/AdPopcornSSPNativeAd.h>
#import "AdMobAdapter.h"

- (void)viewDidLoad {
    [super viewDidLoad];

GADNativeAdView *gamNativeAdView =
    [[NSBundle mainBundle] loadNibNamed:@"GADNativeAdView" owner:nil options:nil].firstObject;

APGAMNativeAdRenderer *apGAMNativeAdRenderer = [[APGAMNativeAdRenderer alloc] init];
apGAMNativeAdRenderer.gamNativeAdView = gamNativeAdView;
[_adPopcornSSPNativeAd setGAMRenderer:apGAMNativeAdRenderer superView:gamNativeAdView];
}
```

**Swift**

```swift
let gamNativeAdView = Bundle.main.loadNibNamed("GADNativeAdView",
                                                owner: nil,
                                                options: nil)?.first as? GADNativeAdView

let apGAMNativeAdRenderer = APGAMNativeAdRenderer()
apGAMNativeAdRenderer.gamNativeAdView = gamNativeAdView
adPopcornSSPNativeAd.setGAMRenderer(apGAMNativeAdRenderer, superView: gamNativeAdView)
```

</details>

<details>

<summary><strong>ADOP / AdForus</strong></summary>

ADOP, AdForus는 AdMob과 동일한 `GADNativeAdView.xib`를 사용합니다.

**ADOP - Objective-C**

```objc
GADNativeAdView *adopNativeAdView =
    [[NSBundle mainBundle] loadNibNamed:@"GADNativeAdView" owner:nil options:nil].firstObject;

APADOPNativeAdRenderer *renderer = [[APADOPNativeAdRenderer alloc] init];
renderer.adopNativeAdView = adopNativeAdView;
[_adPopcornSSPNativeAd setADOPRenderer:renderer superView:adopNativeAdView];
```

**ADOP - Swift**

```swift
let adopNativeAdView = Bundle.main.loadNibNamed("GADNativeAdView",
                                                 owner: nil,
                                                 options: nil)?.first as? GADNativeAdView

let renderer = APADOPNativeAdRenderer()
renderer.adopNativeAdView = adopNativeAdView
adPopcornSSPNativeAd.setADOPRenderer(renderer, superView: adopNativeAdView)
```

**AdForus - Objective-C**

```objc
GADNativeAdView *adforusNativeAdView =
    [[NSBundle mainBundle] loadNibNamed:@"GADNativeAdView" owner:nil options:nil].firstObject;

APAdforusNativeAdRenderer *renderer = [[APAdforusNativeAdRenderer alloc] init];
renderer.adforusNativeAdView = adforusNativeAdView;
[_adPopcornSSPNativeAd setAdForusRenderer:renderer superView:adforusNativeAdView];
```

**AdForus - Swift**

```swift
let adforusNativeAdView = Bundle.main.loadNibNamed("GADNativeAdView",
                                                    owner: nil,
                                                    options: nil)?.first as? GADNativeAdView

let renderer = APAdforusNativeAdRenderer()
renderer.adforusNativeAdView = adforusNativeAdView
adPopcornSSPNativeAd.setAdForusRenderer(renderer, superView: adforusNativeAdView)
```

</details>

<details>

<summary><strong>AppLovinMax</strong></summary>

{% hint style="info" %}
[NativeManualAdView.xib 다운로드](#) — AppLovinMax 네이티브 전용 xib
{% endhint %}

**Objective-C**

```objc
MANativeAdView *maxNativeAdView =
    [MANativeAdView nativeAdViewFromAd:nil withTemplate:@"" /* 또는 xib 로드 */];

APAppLovinMaxNativeAdRenderer *renderer = [[APAppLovinMaxNativeAdRenderer alloc] init];
renderer.appLovinNativeAdView = maxNativeAdView;
[_adPopcornSSPNativeAd setAppLovinMaxRenderer:renderer superView:maxNativeAdView];
```

**Swift**

```swift
let maxNativeAdView = MANativeAdView(/* xib 또는 template */)

let renderer = APAppLovinMaxNativeAdRenderer()
renderer.appLovinNativeAdView = maxNativeAdView
adPopcornSSPNativeAd.setAppLovinMaxRenderer(renderer, superView: maxNativeAdView)
```

</details>

<details>

<summary><strong>Pangle</strong></summary>

Pangle 네이티브는 코드로 UI를 구성하고 `APPangleNativeAdRenderer`에 각 컴포넌트를 매칭합니다.

| 프로퍼티         | 타입          | 설명            |
| ------------ | ----------- | ------------- |
| nativeAdView | UIView      | 최상위 광고 뷰 (필수) |
| iconView     | UIImageView | 아이콘 이미지       |
| titleLbl     | UILabel     | 광고 제목         |
| adTextLbl    | UILabel     | 광고 설명         |
| ratingLbl    | UILabel     | 평점            |
| sponsorLbl   | UILabel     | 스폰서           |
| downloadBtn  | UIButton    | CTA 버튼        |

**Objective-C**

```objc
APPangleNativeAdRenderer *renderer = [[APPangleNativeAdRenderer alloc] init];
renderer.nativeAdView = _pangleNativeAdView;
renderer.iconView = _pangleIconView;
renderer.titleLbl = _pangleTitleLabel;
renderer.adTextLbl = _pangleDescLabel;
renderer.downloadBtn = _pangleCTAButton;
[_adPopcornSSPNativeAd setPangleRenderer:renderer superView:_pangleNativeAdView];
```

**Swift**

```swift
let renderer = APPangleNativeAdRenderer()
renderer.nativeAdView = pangleNativeAdView
renderer.iconView = pangleIconView
renderer.titleLbl = pangleTitleLabel
renderer.adTextLbl = pangleDescLabel
renderer.downloadBtn = pangleCTAButton
adPopcornSSPNativeAd.setPangleRenderer(renderer, superView: pangleNativeAdView)
```

</details>

<details>

<summary><strong>FAN (Meta)</strong></summary>

FAN은 일반 네이티브(`APFANNativeAdRenderer`)와 네이티브 배너(`APFANNativeBannerAdRenderer`) 두 가지를 지원합니다.

#### FAN 일반 네이티브

| 프로퍼티                 | 타입              | 설명            |
| -------------------- | --------------- | ------------- |
| adUIView             | UIView          | 최상위 광고 뷰 (필수) |
| adIconImageView      | FBMediaView     | 아이콘 이미지       |
| adCoverMediaView     | FBMediaView     | 메인 미디어 뷰      |
| adTitleLable         | UILabel         | 광고 제목         |
| adBodyLabel          | UILabel         | 광고 설명         |
| adCallToActionButton | UIButton        | CTA 버튼        |
| adSocialContextLabel | UILabel         | 소셜 컨텍스트       |
| adSponsoredLabel     | UILabel         | 스폰서 라벨        |
| adChoicesView        | FBAdChoicesView | AdChoices 뷰   |

**Objective-C**

```objc
APFANNativeAdRenderer *renderer = [[APFANNativeAdRenderer alloc] init];
renderer.adUIView = _fanNativeAdView;
renderer.adIconImageView = _fanIconImageView;
renderer.adCoverMediaView = _fanCoverMediaView;
renderer.adTitleLable = _fanTitleLabel;
renderer.adBodyLabel = _fanBodyLabel;
renderer.adSponsoredLabel = _fanSponsoredLabel;
renderer.adSocialContextLabel = _fanSocialContextLabel;
renderer.adChoicesView = _fanAdChoicesView;
renderer.adCallToActionButton = _fanCTAButton;
[_adPopcornSSPNativeAd setFANNativeRenderer:renderer superView:_fanNativeAdView];
```

**Swift**

```swift
let renderer = APFANNativeAdRenderer()
renderer.adUIView = fanNativeAdView
renderer.adIconImageView = fanIconImageView
renderer.adCoverMediaView = fanCoverMediaView
renderer.adTitleLable = fanTitleLabel
renderer.adBodyLabel = fanBodyLabel
renderer.adSponsoredLabel = fanSponsoredLabel
renderer.adSocialContextLabel = fanSocialContextLabel
renderer.adChoicesView = fanAdChoicesView
renderer.adCallToActionButton = fanCTAButton
adPopcornSSPNativeAd.setFANNativeRenderer(renderer, superView: fanNativeAdView)
```

#### FAN 네이티브 배너

**Objective-C**

```objc
APFANNativeBannerAdRenderer *renderer = [[APFANNativeBannerAdRenderer alloc] init];
renderer.adUIView = _fanNativeBannerView;
renderer.adIconImageView = _fanBannerIconImageView;
renderer.adSponsoredLabel = _fanBannerSponsoredLabel;
renderer.adAdvertiserNameLabel = _fanBannerAdvertiserNameLabel;
renderer.adChoicesView = _fanBannerAdChoicesView;
renderer.adCallToActionButton = _fanBannerCTAButton;
[_adPopcornSSPNativeAd setFANNativeBannerRenderer:renderer superView:_fanNativeBannerView];
```

**Swift**

```swift
let renderer = APFANNativeBannerAdRenderer()
renderer.adUIView = fanNativeBannerView
renderer.adIconImageView = fanBannerIconImageView
renderer.adSponsoredLabel = fanBannerSponsoredLabel
renderer.adAdvertiserNameLabel = fanBannerAdvertiserNameLabel
renderer.adChoicesView = fanBannerAdChoicesView
renderer.adCallToActionButton = fanBannerCTAButton
adPopcornSSPNativeAd.setFANNativeBannerRenderer(renderer, superView: fanNativeBannerView)
```

</details>

<details>

<summary><strong>Mintegral</strong></summary>

Mintegral 네이티브는 코드로 UI를 구성하고 `APMintegralNativeAdRenderer`에 각 컴포넌트를 매칭합니다.

| 프로퍼티          | 타입               | 설명                  |
| ------------- | ---------------- | ------------------- |
| adUIView      | UIView           | 최상위 광고 뷰 (필수)       |
| iconImageView | UIImageView      | 아이콘 이미지             |
| mMediaView    | MTGMediaView     | Mintegral MediaView |
| appNameLabel  | UILabel          | 앱 이름                |
| appDescLabel  | UILabel          | 앱 설명                |
| adCallButton  | UIButton         | CTA 버튼              |
| adChoicesView | MTGAdChoicesView | AdChoices 뷰         |

**Objective-C**

```objc
APMintegralNativeAdRenderer *renderer = [[APMintegralNativeAdRenderer alloc] init];
renderer.adUIView = _mintegralNativeAdView;
renderer.iconImageView = _mintegralIconView;
renderer.appNameLabel = _mintegralTitleView;
renderer.appDescLabel = _mintegralDescView;
renderer.adCallButton = _mintegralCTAButton;
renderer.mMediaView = _mintegralMediaView;
[_adPopcornSSPNativeAd setMintegralNativeRenderer:renderer superView:_mintegralNativeAdView];
```

**Swift**

```swift
let renderer = APMintegralNativeAdRenderer()
renderer.adUIView = mintegralNativeAdView
renderer.iconImageView = mintegralIconView
renderer.appNameLabel = mintegralTitleView
renderer.appDescLabel = mintegralDescView
renderer.adCallButton = mintegralCTAButton
renderer.mMediaView = mintegralMediaView
adPopcornSSPNativeAd.setMintegralNativeRenderer(renderer, superView: mintegralNativeAdView)
```

</details>

<details>

<summary><strong>InMobi</strong></summary>

InMobi 네이티브는 코드로 UI를 구성하고 `APInMobiNativeAdRenderer`에 각 컴포넌트를 매칭합니다.

| 프로퍼티                | 타입          | 설명                      |
| ------------------- | ----------- | ----------------------- |
| inMobiNativeAdView  | UIView      | 최상위 광고 뷰 (필수)           |
| adTitleLabel        | UILabel     | 광고 제목                   |
| adDescriptionLabel  | UILabel     | 광고 설명                   |
| adIcon              | UIImageView | 아이콘 이미지                 |
| adCtaTextLabel      | UILabel     | CTA 텍스트                 |
| adRatingLabel       | UILabel     | 평점 (optional)           |
| advertiserNameLabel | UILabel     | 광고주명 (optional)         |
| adChoice            | UIImageView | AdChoice 아이콘 (optional) |

**Objective-C**

```objc
APInMobiNativeAdRenderer *renderer = [[APInMobiNativeAdRenderer alloc] init];
renderer.inMobiNativeAdView = _inMobiNativeView;
renderer.adTitleLabel = _inMobiTitleLabel;
renderer.adDescriptionLabel = _inMobiDescLabel;
renderer.adIcon = _inMobiIconView;
renderer.adCtaTextLabel = _inMobiCTALabel;
renderer.adRatingLabel = _inMobiRatingLabel;
renderer.advertiserNameLabel = _inMobiAdvertiserLabel;
renderer.adChoice = _inMobiAdChoiceView;
[_adPopcornSSPNativeAd setInMobiRenderer:renderer superView:_inMobiNativeView];
```

**Swift**

```swift
let renderer = APInMobiNativeAdRenderer()
renderer.inMobiNativeAdView = inMobiNativeView
renderer.adTitleLabel = inMobiTitleLabel
renderer.adDescriptionLabel = inMobiDescLabel
renderer.adIcon = inMobiIconView
renderer.adCtaTextLabel = inMobiCTALabel
renderer.adRatingLabel = inMobiRatingLabel
renderer.advertiserNameLabel = inMobiAdvertiserLabel
renderer.adChoice = inMobiAdChoiceView
adPopcornSSPNativeAd.setInMobiRenderer(renderer, superView: inMobiNativeView)
```

</details>

<details>

<summary><strong>Fyber</strong></summary>

Fyber 네이티브는 코드로 UI를 구성하고 `APFyberAdapterNativeAdRenderer`에 각 컴포넌트를 매칭합니다.

| 프로퍼티             | 타입      | 설명            |
| ---------------- | ------- | ------------- |
| adUIView         | UIView  | 최상위 광고 뷰 (필수) |
| adTitle          | UILabel | 광고 제목         |
| adDescription    | UILabel | 광고 설명         |
| callToActionText | UILabel | CTA 텍스트       |
| appIcon          | UIView  | 아이콘 뷰         |
| mediaView        | UIView  | 미디어 뷰         |

**Objective-C**

<pre class="language-objc"><code class="lang-objc"><strong>APFyberAdapterNativeAdRenderer *renderer = [[APFyberAdapterNativeAdRenderer alloc] init];
</strong>renderer.adUIView = _fyberNativeAdView;
renderer.adTitle = _fyberTitleLabel;
renderer.adDescription = _fyberDescLabel;
renderer.callToActionText = _fyberCTALabel;
renderer.appIcon = _fyberIconView;
renderer.mediaView = _fyberMediaView;
[_adPopcornSSPNativeAd setFyberRenderer:renderer superView:_fyberNativeAdView];
</code></pre>

**Swift**

```swift
let renderer = APFyberAdapterNativeAdRenderer()
renderer.adUIView = fyberNativeAdView
renderer.adTitle = fyberTitleLabel
renderer.adDescription = fyberDescLabel
renderer.callToActionText = fyberCTALabel
renderer.appIcon = fyberIconView
renderer.mediaView = fyberMediaView
adPopcornSSPNativeAd.setFyberRenderer(renderer, superView: fyberNativeAdView)
```

</details>

### 네이티브 샘플

* 위 미디에이션 설정을 모두 포함한 전체 샘플 코드입니다.

<details>

<summary><strong>Objective-C</strong></summary>

```objective-c
#import <AdPopcornSSP/AdPopcornSSPNativeAd.h>
#import "NAMAdapter.h"
#import "AdFitAdapter.h"
#import "AdMobAdapter.h"
#import "FANAdapter.h"
#import "AppLovinMaxDynamicBidAdapter.h"
#import "VungleAdapter.h"
#import "FyberAdapter.h"
#import "MintegralAdapter.h"
#import "InMobiAdapter.h"
#import "PangleAdapter.h"

- (void)viewDidLoad {
    [super viewDidLoad];

    // 1. SDK 설정
    [_adPopcornSSPNativeAd noAdViewHidden:YES];
    _adPopcornSSPNativeAd.delegate = self;
    [_adPopcornSSPNativeAd setPlacementInfoWithAppKey:@"<APP_KEY>"
                                          placementId:@"<PLACEMENT_ID>"
                                       viewController:self];

    // 2. AdPopcornSSP
    APSSPNativeAdRenderer *apSSPRenderer = [[APSSPNativeAdRenderer alloc] init];
    apSSPRenderer.apSSPNativeAdView = _apSSPNativeAdView;
    apSSPRenderer.titleLabel = _apSSPTitleView;
    apSSPRenderer.descLabel = _apSSPDescView;
    apSSPRenderer.mainImageView = _apSSPMainImageView;
    apSSPRenderer.iconImageView = _apSSPIconImageView;
    apSSPRenderer.ctaButton = _apSSPCTAButton;
    apSSPRenderer.ctaLabel = _apSSPCTAView;
    apSSPRenderer.useTemplate = NO;
    [_adPopcornSSPNativeAd setApSSPRenderer:apSSPRenderer superView:_apSSPNativeAdView];

    // 3. FAN 네이티브
    APFANNativeAdRenderer *fanRenderer = [[APFANNativeAdRenderer alloc] init];
    fanRenderer.adUIView = _fanNativeAdView;
    fanRenderer.adIconImageView = _fanIconImageView;
    fanRenderer.adCoverMediaView = _fanCoverMediaView;
    fanRenderer.adTitleLable = _fanTitleLabel;
    fanRenderer.adBodyLabel = _fanBodyLabel;
    fanRenderer.adSponsoredLabel = _fanSponsoredLabel;
    fanRenderer.adSocialContextLabel = _fanSocialContextLabel;
    fanRenderer.adChoicesView = _fanAdChoicesView;
    fanRenderer.adCallToActionButton = _fanCTAButton;
    [_adPopcornSSPNativeAd setFANNativeRenderer:fanRenderer superView:_fanNativeAdView];

    // 4. FAN 네이티브 배너
    APFANNativeBannerAdRenderer *fanBannerRenderer = [[APFANNativeBannerAdRenderer alloc] init];
    fanBannerRenderer.adUIView = _fanNativeBannerView;
    fanBannerRenderer.adIconImageView = _fanBannerIconImageView;
    fanBannerRenderer.adSponsoredLabel = _fanBannerSponsoredLabel;
    fanBannerRenderer.adAdvertiserNameLabel = _fanBannerAdvertiserNameLabel;
    fanBannerRenderer.adChoicesView = _fanBannerAdChoicesView;
    fanBannerRenderer.adCallToActionButton = _fanBannerCTAButton;
    [_adPopcornSSPNativeAd setFANNativeBannerRenderer:fanBannerRenderer superView:_fanNativeBannerView];

    // 5. Mintegral
    APMintegralNativeAdRenderer *mintegralRenderer = [[APMintegralNativeAdRenderer alloc] init];
    mintegralRenderer.adUIView = _mintegralNativeAdView;
    mintegralRenderer.iconImageView = _mintegralIconView;
    mintegralRenderer.appNameLabel = _mintegralTitleView;
    mintegralRenderer.appDescLabel = _mintegralDescView;
    mintegralRenderer.adCallButton = _mintegralCTAButton;
    mintegralRenderer.mMediaView = _mintegralMediaView;
    [_adPopcornSSPNativeAd setMintegralNativeRenderer:mintegralRenderer superView:_mintegralNativeAdView];

    // 6. Vungle
    APVungleNativeAdRenderer *vungleRenderer = [[APVungleNativeAdRenderer alloc] init];
    vungleRenderer.nativeAdView = _vungleNativeAdView;
    vungleRenderer.iconView = _vungleIconView;
    vungleRenderer.mediaView = _vungleMediaView;
    vungleRenderer.titleLbl = _vungleTitleLabel;
    vungleRenderer.ratingLbl = _vungleRatingLabel;
    vungleRenderer.sponsorLbl = _vungleSponsorLabel;
    vungleRenderer.adTextLbl = _vungleDescLabel;
    vungleRenderer.downloadBtn = _vungleCTAButton;
    [_adPopcornSSPNativeAd setVungleRenderer:vungleRenderer superView:_vungleNativeAdView];

    // 7. Fyber
    APFyberAdapterNativeAdRenderer *fyberRenderer = [[APFyberAdapterNativeAdRenderer alloc] init];
    fyberRenderer.adUIView = _fyberNativeAdView;
    fyberRenderer.adTitle = _fyberTitleLabel;
    fyberRenderer.adDescription = _fyberDescLabel;
    fyberRenderer.mediaView = _fyberMediaView;
    [_adPopcornSSPNativeAd setFyberRenderer:fyberRenderer superView:_fyberNativeAdView];

    // 8. InMobi
    APInMobiNativeAdRenderer *inMobiRenderer = [[APInMobiNativeAdRenderer alloc] init];
    inMobiRenderer.inMobiNativeAdView = _inMobiNativeView;
    inMobiRenderer.adTitleLabel = _inMobiTitleLabel;
    inMobiRenderer.adDescriptionLabel = _inMobiDescLabel;
    inMobiRenderer.adIcon = _inMobiIconView;
    inMobiRenderer.adCtaTextLabel = _inMobiCTALabel;
    inMobiRenderer.adRatingLabel = _inMobiRatingLabel;
    inMobiRenderer.advertiserNameLabel = _inMobiAdvertiserLabel;
    inMobiRenderer.adChoice = _inMobiAdChoiceView;
    [_adPopcornSSPNativeAd setInMobiRenderer:inMobiRenderer superView:_inMobiNativeView];

    // 9. AdMob
    GADNativeAdView *admobNativeAdView =
        [[NSBundle mainBundle] loadNibNamed:@"GADNativeAdView" owner:nil options:nil].firstObject;
    APAdMobNativeAdRenderer *admobRenderer = [[APAdMobNativeAdRenderer alloc] init];
    admobRenderer.admobNativeAdView = admobNativeAdView;
    [_adPopcornSSPNativeAd setAdMobRenderer:admobRenderer superView:admobNativeAdView];

    // 10. GAM
    GADNativeAdView *gamNativeAdView =
        [[NSBundle mainBundle] loadNibNamed:@"GADNativeAdView" owner:nil options:nil].firstObject;
    APGAMNativeAdRenderer *gamRenderer = [[APGAMNativeAdRenderer alloc] init];
    gamRenderer.gamNativeAdView = gamNativeAdView;
    [_adPopcornSSPNativeAd setGAMRenderer:gamRenderer superView:gamNativeAdView];

    // 11. ADOP
    GADNativeAdView *adopNativeAdView =
        [[NSBundle mainBundle] loadNibNamed:@"GADNativeAdView" owner:nil options:nil].firstObject;
    APADOPNativeAdRenderer *adopRenderer = [[APADOPNativeAdRenderer alloc] init];
    adopRenderer.adopNativeAdView = adopNativeAdView;
    [_adPopcornSSPNativeAd setADOPRenderer:adopRenderer superView:adopNativeAdView];

    // 12. AdForus
    GADNativeAdView *adforusNativeAdView =
        [[NSBundle mainBundle] loadNibNamed:@"GADNativeAdView" owner:nil options:nil].firstObject;
    APAdforusNativeAdRenderer *adforusRenderer = [[APAdforusNativeAdRenderer alloc] init];
    adforusRenderer.adforusNativeAdView = adforusNativeAdView;
    [_adPopcornSSPNativeAd setAdForusRenderer:adforusRenderer superView:adforusNativeAdView];

    // 13. NAM (SimpleAd + NativeAd)
    CGFloat width = [UIScreen mainScreen].bounds.size.width;
    CGFloat xibHeight = round((width * 185) / 360 * 10) / 10;

    GFPNativeSimpleAdView *namSimpleAdView = [[GFPNativeSimpleAdView alloc]
        initWithFrame:CGRectMake(0, 0, width, xibHeight)];
    GFPNativeAdView *namNativeAdView =
        [[NSBundle mainBundle] loadNibNamed:@"GFPNativeAdView" owner:nil options:nil].firstObject;
    namNativeAdView.frame = CGRectMake(0, 0, width, xibHeight);

    APNAMNativeAdRenderer *namRenderer = [[APNAMNativeAdRenderer alloc] init];
    namRenderer.namNativeSimpleAdView = namSimpleAdView;
    namRenderer.namNativeAdView = namNativeAdView;
    namRenderer.backgroundBlur = YES;
    namRenderer.namNativeSuperView = _adNAMNativeSuperView;
    [_adPopcornSSPNativeAd setNAMRenderer:namRenderer superView:_adNAMNativeSuperView];

    // 14. AppLovinMax
    MANativeAdView *maxNativeAdView =
        [[NSBundle mainBundle] loadNibNamed:@"NativeManualAdView" owner:nil options:nil].firstObject;
    maxNativeAdView.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 250);
    APAppLovinMaxNativeAdRenderer *maxRenderer = [[APAppLovinMaxNativeAdRenderer alloc] init];
    maxRenderer.appLovinNativeAdView = maxNativeAdView;
    [_adPopcornSSPNativeAd setAppLovinMaxRenderer:maxRenderer superView:maxNativeAdView];

    // 15. AdFit (BizBoard)
    BizBoardTemplate *bizBoardTemplate = [[BizBoardTemplate alloc] init];
    APAdFitNativeAdRenderer *adFitRenderer = [[APAdFitNativeAdRenderer alloc] init];
    adFitRenderer.adfitBizBoardTemplate = bizBoardTemplate;
    adFitRenderer.bizBoardInfoIconTopConstant = 10;
    adFitRenderer.bizBoardInfoIconRightConstant = -16;
    [_adPopcornSSPNativeAd setAdFitRenderer:adFitRenderer superView:bizBoardTemplate];

    // 15-1. AdFit (일반 네이티브 사용 시)
    /*
    APSSPAdfitNativeAdView *adfitNativeAd =
        [[NSBundle mainBundle] loadNibNamed:@"APSSPAdfitNativeAdView" owner:nil options:nil].firstObject;
    adfitNativeAd.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 250);
    APAdFitNativeAdRenderer *adFitRenderer = [[APAdFitNativeAdRenderer alloc] init];
    adFitRenderer.useBizBoardTemplate = NO;
    adFitRenderer.adfitNativeAdUIView = adfitNativeAd;
    [_adPopcornSSPNativeAd setAdFitRenderer:adFitRenderer superView:adfitNativeAd];
    */

    // 16. Pangle
    APPangleNativeAdRenderer *pangleRenderer = [[APPangleNativeAdRenderer alloc] init];
    pangleRenderer.nativeAdView = _pangleNativeAdView;
    pangleRenderer.iconView = _pangleIconView;
    pangleRenderer.titleLbl = _pangleTitleLabel;
    pangleRenderer.adTextLbl = _pangleDescLabel;
    pangleRenderer.downloadBtn = _pangleCTAButton;
    [_adPopcornSSPNativeAd setPangleRenderer:pangleRenderer superView:_pangleNativeAdView];

    // 17. 광고 요청
    [_adPopcornSSPNativeAd loadRequest];
}
```

</details>

<details>

<summary><strong>Swift</strong></summary>

```swift
import UIKit
import AdPopcornSSP

override func viewDidLoad() {
    super.viewDidLoad()

    // 1. SDK 설정
    adPopcornSSPNativeAd.noAdViewHidden(true)
    adPopcornSSPNativeAd.delegate = self
    adPopcornSSPNativeAd.setPlacementInfoWithAppKey("<APP_KEY>",
                                                     placementId: "<PLACEMENT_ID>",
                                                     viewController: self)

    // 2. AdPopcornSSP
    let apSSPRenderer = APSSPNativeAdRenderer()
    apSSPRenderer.apSSPNativeAdView = apSSPNativeAdView
    apSSPRenderer.titleLabel = apSSPTitleView
    apSSPRenderer.descLabel = apSSPDescView
    apSSPRenderer.mainImageView = apSSPMainImageView
    apSSPRenderer.iconImageView = apSSPIconImageView
    apSSPRenderer.ctaButton = apSSPCTAButton
    apSSPRenderer.ctaLabel = apSSPCTAView
    apSSPRenderer.useTemplate = false
    adPopcornSSPNativeAd.setApSSPRenderer(apSSPRenderer, superView: apSSPNativeAdView)

    // 3. FAN 네이티브
    let fanRenderer = APFANNativeAdRenderer()
    fanRenderer.adUIView = fanNativeAdView
    fanRenderer.adIconImageView = fanIconImageView
    fanRenderer.adCoverMediaView = fanCoverMediaView
    fanRenderer.adTitleLable = fanTitleLabel
    fanRenderer.adBodyLabel = fanBodyLabel
    fanRenderer.adSponsoredLabel = fanSponsoredLabel
    fanRenderer.adSocialContextLabel = fanSocialContextLabel
    fanRenderer.adChoicesView = fanAdChoicesView
    fanRenderer.adCallToActionButton = fanCTAButton
    adPopcornSSPNativeAd.setFANNativeRenderer(fanRenderer, superView: fanNativeAdView)

    // 4. FAN 네이티브 배너
    let fanBannerRenderer = APFANNativeBannerAdRenderer()
    fanBannerRenderer.adUIView = fanNativeBannerView
    fanBannerRenderer.adIconImageView = fanBannerIconImageView
    fanBannerRenderer.adSponsoredLabel = fanBannerSponsoredLabel
    fanBannerRenderer.adAdvertiserNameLabel = fanBannerAdvertiserNameLabel
    fanBannerRenderer.adChoicesView = fanBannerAdChoicesView
    fanBannerRenderer.adCallToActionButton = fanBannerCTAButton
    adPopcornSSPNativeAd.setFANNativeBannerRenderer(fanBannerRenderer, superView: fanNativeBannerView)

    // 5. Mintegral
    let mintegralRenderer = APMintegralNativeAdRenderer()
    mintegralRenderer.adUIView = mintegralNativeAdView
    mintegralRenderer.iconImageView = mintegralIconView
    mintegralRenderer.appNameLabel = mintegralTitleView
    mintegralRenderer.appDescLabel = mintegralDescView
    mintegralRenderer.adCallButton = mintegralCTAButton
    mintegralRenderer.mMediaView = mintegralMediaView
    adPopcornSSPNativeAd.setMintegralNativeRenderer(mintegralRenderer, superView: mintegralNativeAdView)

    // 6. Vungle
    let vungleRenderer = APVungleNativeAdRenderer()
    vungleRenderer.nativeAdView = vungleNativeAdView
    vungleRenderer.iconView = vungleIconView
    vungleRenderer.mediaView = vungleMediaView
    vungleRenderer.titleLbl = vungleTitleLabel
    vungleRenderer.ratingLbl = vungleRatingLabel
    vungleRenderer.sponsorLbl = vungleSponsorLabel
    vungleRenderer.adTextLbl = vungleDescLabel
    vungleRenderer.downloadBtn = vungleCTAButton
    adPopcornSSPNativeAd.setVungleRenderer(vungleRenderer, superView: vungleNativeAdView)

    // 7. Fyber
    let fyberRenderer = APFyberAdapterNativeAdRenderer()
    fyberRenderer.adUIView = fyberNativeAdView
    fyberRenderer.adTitle = fyberTitleLabel
    fyberRenderer.adDescription = fyberDescLabel
    fyberRenderer.mediaView = fyberMediaView
    adPopcornSSPNativeAd.setFyberRenderer(fyberRenderer, superView: fyberNativeAdView)

    // 8. InMobi
    let inMobiRenderer = APInMobiNativeAdRenderer()
    inMobiRenderer.inMobiNativeAdView = inMobiNativeView
    inMobiRenderer.adTitleLabel = inMobiTitleLabel
    inMobiRenderer.adDescriptionLabel = inMobiDescLabel
    inMobiRenderer.adIcon = inMobiIconView
    inMobiRenderer.adCtaTextLabel = inMobiCTALabel
    inMobiRenderer.adRatingLabel = inMobiRatingLabel
    inMobiRenderer.advertiserNameLabel = inMobiAdvertiserLabel
    inMobiRenderer.adChoice = inMobiAdChoiceView
    adPopcornSSPNativeAd.setInMobiRenderer(inMobiRenderer, superView: inMobiNativeView)

    // 9. AdMob
    let admobNativeAdView = Bundle.main.loadNibNamed("GADNativeAdView",
                                                      owner: nil, options: nil)?.first as? GADNativeAdView
    let admobRenderer = APAdMobNativeAdRenderer()
    admobRenderer.admobNativeAdView = admobNativeAdView
    adPopcornSSPNativeAd.setAdMobRenderer(admobRenderer, superView: admobNativeAdView)

    // 10. GAM
    let gamNativeAdView = Bundle.main.loadNibNamed("GADNativeAdView",
                                                    owner: nil, options: nil)?.first as? GADNativeAdView
    let gamRenderer = APGAMNativeAdRenderer()
    gamRenderer.gamNativeAdView = gamNativeAdView
    adPopcornSSPNativeAd.setGAMRenderer(gamRenderer, superView: gamNativeAdView)

    // 11. ADOP
    let adopNativeAdView = Bundle.main.loadNibNamed("GADNativeAdView",
                                                     owner: nil, options: nil)?.first as? GADNativeAdView
    let adopRenderer = APADOPNativeAdRenderer()
    adopRenderer.adopNativeAdView = adopNativeAdView
    adPopcornSSPNativeAd.setADOPRenderer(adopRenderer, superView: adopNativeAdView)

    // 12. AdForus
    let adforusNativeAdView = Bundle.main.loadNibNamed("GADNativeAdView",
                                                        owner: nil, options: nil)?.first as? GADNativeAdView
    let adforusRenderer = APAdforusNativeAdRenderer()
    adforusRenderer.adforusNativeAdView = adforusNativeAdView
    adPopcornSSPNativeAd.setAdForusRenderer(adforusRenderer, superView: adforusNativeAdView)

    // 13. NAM (SimpleAd + NativeAd)
    let width = UIScreen.main.bounds.width
    let xibHeight = round((width * 185) / 360 * 10) / 10

    let namSimpleAdView = GFPNativeSimpleAdView(
        frame: CGRect(x: 0, y: 0, width: width, height: xibHeight))
    let namNativeAdView = Bundle.main.loadNibNamed("GFPNativeAdView",
                                                    owner: nil, options: nil)?.first as? GFPNativeAdView
    namNativeAdView?.frame = CGRect(x: 0, y: 0, width: width, height: xibHeight)

    let namRenderer = APNAMNativeAdRenderer()
    namRenderer.namNativeSimpleAdView = namSimpleAdView
    namRenderer.namNativeAdView = namNativeAdView
    namRenderer.backgroundBlur = true
    namRenderer.namNativeSuperView = adNAMNativeSuperView
    adPopcornSSPNativeAd.setNAMRenderer(namRenderer, superView: adNAMNativeSuperView)

    // 14. AppLovinMax
    let maxNativeAdView = Bundle.main.loadNibNamed("NativeManualAdView",
                                                    owner: nil, options: nil)?.first as? MANativeAdView
    maxNativeAdView?.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 250)
    let maxRenderer = APAppLovinMaxNativeAdRenderer()
    maxRenderer.appLovinNativeAdView = maxNativeAdView
    adPopcornSSPNativeAd.setAppLovinMaxRenderer(maxRenderer, superView: maxNativeAdView)

    // 15. AdFit (BizBoard)
    let bizBoardTemplate = BizBoardTemplate()
    let adFitRenderer = APAdFitNativeAdRenderer()
    adFitRenderer.adfitBizBoardTemplate = bizBoardTemplate
    adFitRenderer.bizBoardInfoIconTopConstant = 10
    adFitRenderer.bizBoardInfoIconRightConstant = -16
    adPopcornSSPNativeAd.setAdFitRenderer(adFitRenderer, superView: bizBoardTemplate)

    // 15-1. AdFit (일반 네이티브 사용 시)
    /*
    let adfitNativeAd = Bundle.main.loadNibNamed("APSSPAdfitNativeAdView",
                                                  owner: nil, options: nil)?.first as? APSSPAdfitNativeAdView
    adfitNativeAd?.frame = CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: 250)
    let adFitRenderer = APAdFitNativeAdRenderer()
    adFitRenderer.useBizBoardTemplate = false
    adFitRenderer.adfitNativeAdUIView = adfitNativeAd
    adPopcornSSPNativeAd.setAdFitRenderer(adFitRenderer, superView: adfitNativeAd)
    */

    // 16. Pangle
    let pangleRenderer = APPangleNativeAdRenderer()
    pangleRenderer.nativeAdView = pangleNativeAdView
    pangleRenderer.iconView = pangleIconView
    pangleRenderer.titleLbl = pangleTitleLabel
    pangleRenderer.adTextLbl = pangleDescLabel
    pangleRenderer.downloadBtn = pangleCTAButton
    adPopcornSSPNativeAd.setPangleRenderer(pangleRenderer, superView: pangleNativeAdView)

    // 17. 광고 요청
    adPopcornSSPNativeAd.loadRequest()
}
```

</details>
