{"id":10828,"date":"2024-08-27T17:49:08","date_gmt":"2024-08-27T15:49:08","guid":{"rendered":"https:\/\/refinery89.com\/docs\/ios-monetize-app-sdk-documentation\/user-manual\/ad-formats\/infinite-scroll\/"},"modified":"2024-08-27T17:56:27","modified_gmt":"2024-08-27T15:56:27","slug":"infinite-scroll","status":"publish","type":"docs","link":"https:\/\/refinery89.com\/pl\/docs\/ios-monetize-app-sdk-documentation\/user-manual\/ad-formats\/infinite-scroll\/","title":{"rendered":"Infinite Scroll"},"content":{"rendered":"<div class=\"ak-renderer-extension\" data-layout=\"default\">\n<div class=\"ak-renderer-extension-overflow-container\">\n<div class=\"_1reo1wug _18m91wug _ugi3idpf _gutmidpf\" title=\"Macro (toc)\" data-fabric-macro=\"e4f91a07-c0cf-4e29-bbec-8cd3f1b147e4\" data-macro-body=\"true\" data-macro-parameters=\"{&quot;style&quot;:{&quot;value&quot;:&quot;none&quot;}}\" data-testid=\"printable-wrapper\">\n<div class=\"macro-core toc-macro conf-macro output-block\" data-cssliststyle=\"none\" data-headerelements=\"H1,H2,H3,H4,H5,H6\" data-hasbody=\"false\" data-macro-name=\"toc\" data-macro-id=\"e4f91a07-c0cf-4e29-bbec-8cd3f1b147e4\">\n<ul data-testid=\"list-style-toc-level-container\">\n<li class=\"_qtt8140o\" data-testid=\"list-style-toc-item-container\"><span class=\"toc-item-body\" data-outline=\"1\"><a class=\"_1wyb3gti toc-link\" href=\"#Prerequisites\" data-testid=\"toc-item-body\">Prerequisites<\/a><\/span><\/li>\n<li class=\"_qtt8140o\" data-testid=\"list-style-toc-item-container\"><span class=\"toc-item-body\" data-outline=\"2\"><a class=\"_1wyb3gti toc-link\" href=\"#Display-Ad-Inside-UITableView\" data-testid=\"toc-item-body\">Display Ad Inside UITableView<\/a><\/span>\n<ul data-testid=\"list-style-toc-level-container\">\n<li class=\"_qtt8140o\" data-testid=\"list-style-toc-item-container\"><span class=\"toc-item-body\" data-outline=\"2.1\"><a class=\"_1wyb3gti toc-link\" href=\"#1.-Prepare-the-Item-Cell\" data-testid=\"toc-item-body\">1. Prepare the Item Cell<\/a><\/span><\/li>\n<li class=\"_qtt8140o\" data-testid=\"list-style-toc-item-container\"><span class=\"toc-item-body\" data-outline=\"2.2\"><a class=\"_1wyb3gti toc-link\" href=\"#2.-Prepare-the-UITableView\" data-testid=\"toc-item-body\">2. Prepare the UITableView<\/a><\/span><\/li>\n<li class=\"_qtt8140o\" data-testid=\"list-style-toc-item-container\"><span class=\"toc-item-body\" data-outline=\"2.3\"><a class=\"_1wyb3gti toc-link\" href=\"#3.-Prepare-the-UITableViewDelegate-and-UITableViewDataSource\" data-testid=\"toc-item-body\">3. Prepare the UITableViewDelegate and UITableViewDataSource<\/a><\/span><\/li>\n<\/ul>\n<\/li>\n<li class=\"_qtt8140o\" data-testid=\"list-style-toc-item-container\"><span class=\"toc-item-body\" data-outline=\"3\"><a class=\"_1wyb3gti toc-link\" href=\"#Lifecycle-Events\" data-testid=\"toc-item-body\">Lifecycle Events<\/a><\/span><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h1 id=\"Prerequisites\" data-renderer-start-pos=\"2\">Prerequisites<\/h1>\n<ul class=\"ak-ul\" data-indent-level=\"1\">\n<li>\n<p data-renderer-start-pos=\"19\"><a class=\"cc-1rn59kg\" title=\"\/wiki\/spaces\/R8P\/pages\/1023082526\" href=\"https:\/\/refinery89.com\/pl\/docs\/monetize-app-sdk-documentation-ios\/user-manual\/zacznij-optymalizowac-przychody-reklamowe\/\" target=\"_blank\" rel=\"noopener\" data-testid=\"link-with-safety\" data-renderer-mark=\"true\">Zacznij<\/a>.<\/p>\n<\/li>\n<\/ul>\n<p data-renderer-start-pos=\"35\">The SDK provides a universal way to display advertisements inside the cell of scrollable controls, such as UITableView and UICollectionView.<\/p>\n<div class=\"ak-editor-panel cc-tqp4ke sdk-info\" data-panel-type=\"info\">\n<div class=\"ak-editor-panel__content\">\n<p data-renderer-start-pos=\"179\">Keep in mind that the cell item should provide an empty wrapper view to the SDK, so the SDK will use that wrapper view to place an advertisement in it. Therefore the cell size should be dynamic, because the advertisement size is dynamic as well.<\/p>\n<p data-renderer-start-pos=\"427\">As an alternative approach, to manually adjust cell\u2019s layout, track the size of the advertisement by using <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">childAdLifecycle<\/code> parameter of <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">RefineryAdFactory.shared.getInfiniteScrollAdForIndex<\/code> method.<\/p>\n<\/p><\/div>\n<\/div>\n<p><\/br><\/p>\n<h1 id=\"Display-Ad-Inside-UITableView\" data-renderer-start-pos=\"627\">Display Ad Inside UITableView<\/h1>\n<p data-renderer-start-pos=\"658\">To place an Ad inside the cell item, SDK provides three main methods, one to generate <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">infiniteScrollID<\/code> via calling <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">RefineryAdFactory.shared.createManualInfiniteScroll<\/code>, next to place an ad inside the wrapper for the cell position <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">RefineryAdFactory.shared.getInfiniteScrollAdForIndex(...)<\/code>, and the last to hide the advertisement for a position <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">RefineryAdFactory.shared.hideInfiniteScrollAdForIndex(...)<\/code>.<\/p>\n<h2 id=\"1.-Prepare-the-Item-Cell\" data-renderer-start-pos=\"1061\">1. Prepare the Item Cell<\/h2>\n<p data-renderer-start-pos=\"1087\">Let\u2019s start by creating a cell item, the <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">AdItemCell<\/code>. It contains two child views, one is the <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">UILabel<\/code> which will display the cell position, and the other is <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">UIView<\/code> which is the wrapper container for the advertisement.<\/p>\n<div class=\"code-block\">\n<pre>\r\n        class AdItemCell: UITableViewCell {\r\n            let centeredLabel = UILabel()\r\n            let adContainer:UIView = {\r\n                let view = UIView()\r\n                view.translatesAutoresizingMaskIntoConstraints = false\r\n                return view\r\n            }()\r\n            \r\n            private var position:Int32 = -1;\r\n            private var infiniteScrollId:Int32 = -1;\r\n            \u2026\r\n            override func prepareForReuse() {\r\n                if position != -1 && infiniteScrollId != -1 {\r\n                    \/\/ Hide the advertisement for a given position\r\n                    RefineryAdFactory.shared.hideInfiniteScrollAdForIndex(infiniteScrollId: infiniteScrollId, itemIndex: position)\r\n                }\r\n            }\r\n            \r\n            \/\/ This method is get called from the UITableViewDataSource.\r\n            func loadAd(position:Int32,infiniteScrollId:Int32){\r\n                self.position = position\r\n                self.infiniteScrollId = infiniteScrollId\r\n                \/\/ Show the advertisement for a given position\r\n                RefineryAdFactory.shared.getInfiniteScrollAdForIndex(infiniteScrollId: infiniteScrollId, itemIndex: position, itemAdWrapper: adContainer, childAdLifecycle: BannerEventListener())\r\n            }\r\n            \u2026\r\n        }\r\n    <\/pre>\n<\/div>\n<div class=\"code-block cc-15qwbrk\"><\/div>\n<p data-renderer-start-pos=\"2378\">Strona <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">loadAd()<\/code> method is called from the <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">UITableViewDataSource <\/code>whenever the <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">cellForRowAt<\/code> delegate method is called, and it uses the <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">getInfiniteScrollAdForIndex<\/code> method to let the SDK determine whether to place an Ad for a given position or not.<\/p>\n<p data-renderer-start-pos=\"2621\">Strona <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">prepareForReuse()<\/code> method is called whenever the cell will be reused, so for that, we need to request SDK to hide the advertisement <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">hideInfiniteScrollAdForIndex<\/code>, because after reusing the cell, a new position will be assigned to the cell and the cell might not be needed to display the ad for its new position.<\/p>\n<h2 id=\"2.-Prepare-the-UITableView\" data-renderer-start-pos=\"2937\">2. Prepare the UITableView<\/h2>\n<p data-renderer-start-pos=\"2965\">Next is to generate <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">infiniteScrollId<\/code> by using <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">RefineryAdFactory.shared.createManualInfiniteScroll<\/code> method<\/p>\n<div class=\"code-block\">\n<pre>\r\n        class InfiniteScrollViewController: UIViewController {\r\n\r\n            var tableView:UITableView!\r\n            var infiniteScrollId: Int32!\r\n            \r\n            override func viewDidLoad() {\r\n                super.viewDidLoad()\r\n                \/\/ Generate the infiniteScrollId\r\n                let infiniteScrollConfigID = ConfigBuilder.companion.INFINITE_SCROLL_TEST_R89_CONFIG_ID\r\n                infiniteScrollId = RefineryAdFactory.shared.createManualInfiniteScroll(configurationID: infiniteScrollConfigID, lifecycleCallbacks: nil)\r\n                \r\n                \/\/ Table view configuration\r\n                tableView = UITableView(frame: self.view.bounds, style: .plain)\r\n                tableView.register(AdItemCell.self, forCellReuseIdentifier: \u201ccell\u201d)\r\n                tableView.dataSource = self\r\n                tableView.delegate = self\r\n                tableView.rowHeight = UITableView.automaticDimension\r\n                \r\n                self.view.addSubview(tableView)\r\n                \r\n                \u2026\r\n            }\r\n        }\r\n    <\/pre>\n<\/div>\n<div class=\"code-block cc-15qwbrk\"><\/div>\n<h2 id=\"3.-Prepare-the-UITableViewDelegate-and-UITableViewDataSource\" data-renderer-start-pos=\"3943\">3. Prepare the <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">UITableViewDelegate<\/code> i <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">UITableViewDataSource<\/code><\/h2>\n<p data-renderer-start-pos=\"4005\">Last, we need to bind together the cell and the table view.<\/p>\n<div class=\"code-block\">\n<pre>\r\n        extension InfiniteScrollViewController: UITableViewDelegate, UITableViewDataSource {\r\n\r\n            func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {\r\n                return 1000\r\n            }\r\n            \r\n            func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\r\n                let cell = tableView.dequeueReusableCell(withIdentifier: \u201ccell\u201d, for: indexPath) as! AdItemCell\r\n                cell.centeredLabel.text = \u201cRow \\(indexPath.row)\u201d\r\n                \/\/ Here we set the item\u2019s position and generated infiniteScrollId\r\n                cell.loadAd(position: Int32(indexPath.row), infiniteScrollId: Int32(infiniteScrollId))\r\n                return cell\r\n            }\r\n        }\r\n    <\/pre>\n<\/div>\n<div class=\"code-block cc-15qwbrk\"><\/div>\n<p data-renderer-start-pos=\"4739\">Inside the <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">cellForRowAt<\/code> delegate\u2019s method, we are passing the generated <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">infiniteScrollId<\/code> to the cell item.<\/p>\n<h1 id=\"Lifecycle-Events\" data-renderer-start-pos=\"4849\">Lifecycle Events<\/h1>\n<p data-renderer-start-pos=\"4867\">There are two paths available to track the advertisement events for the infinite scroll.<\/p>\n<p data-renderer-start-pos=\"4958\">The first one is the general event listener, which notifies about all Ad events in the scrollable view.<br \/>\nUse <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">InfiniteScrollEventListener<\/code> to listen to general events in the scroll view by passing its instance to <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">RefineryAdFactory.shared.createManualInfiniteScroll<\/code> method while generating an <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">infiniteScrollId<\/code>, as demonstrated below<\/p>\n<div class=\"code-block\">\n<pre>\r\n        override func viewDidLoad() {\r\n            super.viewDidLoad()\r\n            \u2026\r\n            let infiniteScrollConfigID = ConfigBuilder.companion.INFINITE_SCROLL_TEST_R89_CONFIG_ID\r\n            infiniteScrollId = RefineryAdFactory.shared.createManualInfiniteScroll(configurationID: infiniteScrollConfigID, lifecycleCallbacks: LoggerInfiniteScrollEventListener())\r\n            \u2026\r\n        }\r\n    <\/pre>\n<\/div>\n<div class=\"code-block cc-15qwbrk\"><\/div>\n<p data-renderer-start-pos=\"5654\">Here is the implementation of <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">LoggerInfiniteScrollEventListener<\/code>.<\/p>\n<div class=\"code-block\">\n<pre>\r\n        class LoggerInfiniteScrollEventListener: InfiniteScrollEventListener{\r\n            override func onRoll(itemIdInData: Int32) {\r\n                print(\u201conRoll\u201d,\u201ditemIdInData=\\(itemIdInData)\u201d)\r\n            }\r\n            \r\n            override func onRollFailed(itemIdInData: Int32) {\r\n                print(\u201conRollFailed\u201d,\u201ditemIdInData=\\(itemIdInData)\u201d)\r\n            }\r\n            \r\n            override func onAdItemFailedToCreate(message: String) {\r\n                print(\u201conAdItemFailedToCreate\u201d,\u201dmessage=\\(message)\u201d)\r\n            }\r\n            \r\n            override func onAdItemOpen(itemIdInData: Int32) {\r\n                print(\u201conAdItemOpen\u201d,\u201ditemIdInData=\\(itemIdInData)\u201d)\r\n            \r\n            }\r\n            \r\n            override func onAdItemClick(itemIdInData: Int32) {\r\n                print(\u201conAdItemClick\u201d,\u201ditemIdInData=\\(itemIdInData)\u201d)\r\n            \r\n            }\r\n            \r\n            override func onAdItemClose(itemIdInData: Int32) {\r\n                print(\u201conAdItemClose\u201d,\u201ditemIdInData=\\(itemIdInData)\u201d)\r\n            \r\n            }\r\n            \r\n            override func onAdItemLoaded(itemIdInData: Int32) {\r\n                print(\u201conAdItemLoaded\u201d,\u201ditemIdInData=\\(itemIdInData)\u201d)\r\n            \r\n            }\r\n            \r\n            override func onAdItemImpression(itemIdInData: Int32) {\r\n                print(\u201conAdItemImpression\u201d,\u201ditemIdInData=\\(itemIdInData)\u201d)\r\n            \r\n            }\r\n            \r\n            override func onAdItemCreated(adapterId: Int32, probability: Double) {\r\n                print(\u201conAdItemCreated\u201d,\u201dadapterId=\\(adapterId)\u201d,\u201dprobability=\\(probability)\u201d)\r\n            \r\n            }\r\n            \r\n            override func onAdItemFailedToLoad(itemIdInData: Int32, error: R89LoadError) {\r\n                print(\u201conAdItemFailedToLoad\u201d,\u201ditemIdInData=\\(itemIdInData)\u201d,\u201derror=\\(error)\u201d)\r\n            }\r\n        }\r\n    <\/pre>\n<\/div>\n<div class=\"code-block cc-15qwbrk\"><\/div>\n<p data-renderer-start-pos=\"7171\">The other way to track advertisement lifecycle events is to pass an instance of <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">BannerEventListener<\/code>to the <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">RefineryAdFactory.shared.getInfiniteScrollAdForIndex<\/code> method. In contrast with the first approach, this one will listen to a single advertisement\u2019s lifecycle events for a given position.<\/p>\n<div class=\"code-block\">\n<pre>\r\n        func loadAd(position:Int32,infiniteScrollId:Int32){\r\n            self.position = position\r\n            self.infiniteScrollId = infiniteScrollId\r\n            \/\/ Show the advertisement for a given position\r\n            RefineryAdFactory.shared.getInfiniteScrollAdForIndex(infiniteScrollId: infiniteScrollId, itemIndex: position, itemAdWrapper: adContainer, childAdLifecycle: BanneEventLogger())\r\n        }\r\n    <\/pre>\n<\/div>\n<div class=\"code-block cc-15qwbrk\"><\/div>\n<p data-renderer-start-pos=\"7845\">Here is the implementation of <code class=\"code cc-1o5d2cw\" data-renderer-mark=\"true\">BanneEventLogger<\/code>.<\/p>\n<div class=\"code-block\">\n<pre>\r\n        class BanneEventLogger: BannerEventListener {\r\n            override func onLayoutChange(width: Int32, height: Int32) {\r\n                print(\u201conLayoutChange\u201d,\u201dwidth=\\(width)\u201d,\u201dheight=\\(height)\u201d)\r\n            }\r\n            \r\n            override func onLoaded() {\r\n                print(\u201conLoaded\u201d)\r\n            }\r\n            \r\n            override func onOpen() {\r\n                print(\u201conOpen\u201d)\r\n            }\r\n            \r\n            override func onClick() {\r\n                print(\u201conClick\u201d)\r\n            }\r\n            \r\n            override func onClose() {\r\n                print(\u201conClose\u201d)\r\n            }\r\n            \r\n            override func onImpression() {\r\n                print(\u201conImpression\u201d)\r\n            }\r\n            \r\n            override func onFailedToLoad(error: R89LoadError) {\r\n                print(\u201conFailedToLoad\u201d,\u201derror=\\(error)\u201d)\r\n            }\r\n        }\r\n    <\/pre>\n<\/div>\n<div class=\"code-block cc-15qwbrk\"><\/div>","protected":false},"featured_media":0,"parent":10819,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","doc_tag":[],"class_list":["post-10828","docs","type-docs","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Infinite Scroll | Refinery89<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/refinery89.com\/pl\/docs\/ios-monetize-app-sdk-documentation\/user-manual\/formaty-reklam\/infinite-scroll\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Infinite Scroll | Refinery89\" \/>\n<meta property=\"og:description\" content=\"Prerequisites Display Ad Inside UITableView 1. Prepare the Item Cell 2. Prepare the UITableView 3. Prepare the UITableViewDelegate and UITableViewDataSource Lifecycle Events Prerequisites Get Started. The SDK provides a universal way to display advertisements inside the cell of scrollable controls, such as UITableView and UICollectionView. Keep in mind that the cell item should provide an [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/refinery89.com\/pl\/docs\/ios-monetize-app-sdk-documentation\/user-manual\/formaty-reklam\/infinite-scroll\/\" \/>\n<meta property=\"og:site_name\" content=\"Refinery89\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Refinery89\/\" \/>\n<meta property=\"article:modified_time\" content=\"2024-08-27T15:56:27+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/refinery89.com\/wp-content\/uploads\/2025\/08\/r89-thumbnail.png\" \/>\n\t<meta property=\"og:image:width\" content=\"200\" \/>\n\t<meta property=\"og:image:height\" content=\"200\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@refinery89\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/refinery89.com\/pl\/docs\/ios-monetize-app-sdk-documentation\/user-manual\/formaty-reklam\/infinite-scroll\/\",\"url\":\"https:\/\/refinery89.com\/pl\/docs\/ios-monetize-app-sdk-documentation\/user-manual\/formaty-reklam\/infinite-scroll\/\",\"name\":\"Infinite Scroll | Refinery89\",\"isPartOf\":{\"@id\":\"https:\/\/refinery89.com\/#website\"},\"datePublished\":\"2024-08-27T15:49:08+00:00\",\"dateModified\":\"2024-08-27T15:56:27+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/refinery89.com\/pl\/docs\/ios-monetize-app-sdk-documentation\/user-manual\/formaty-reklam\/infinite-scroll\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/refinery89.com\/pl\/docs\/ios-monetize-app-sdk-documentation\/user-manual\/formaty-reklam\/infinite-scroll\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/refinery89.com\/pl\/docs\/ios-monetize-app-sdk-documentation\/user-manual\/formaty-reklam\/infinite-scroll\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/refinery89.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"IOS &#8211; Monetize App SDK Documentation\",\"item\":\"https:\/\/refinery89.com\/it\/docs\/ios-monetize-app-sdk-documentation\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Privato: User Manual\",\"item\":\"https:\/\/refinery89.com\/it\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Ad Formats\",\"item\":\"https:\/\/refinery89.com\/docs\/ios-monetize-app-sdk-documentation\/user-manual\/ad-formats\/\"},{\"@type\":\"ListItem\",\"position\":5,\"name\":\"Infinite Scroll\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/refinery89.com\/#website\",\"url\":\"https:\/\/refinery89.com\/\",\"name\":\"Refinery89\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/refinery89.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/refinery89.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/refinery89.com\/#organization\",\"name\":\"Refinery89\",\"alternateName\":\"R89\",\"url\":\"https:\/\/refinery89.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/refinery89.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/refinery89.com\/wp-content\/uploads\/2025\/08\/r89-thumbnail.png\",\"contentUrl\":\"https:\/\/refinery89.com\/wp-content\/uploads\/2025\/08\/r89-thumbnail.png\",\"width\":200,\"height\":200,\"caption\":\"Refinery89\"},\"image\":{\"@id\":\"https:\/\/refinery89.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Refinery89\/\",\"https:\/\/x.com\/refinery89\",\"https:\/\/www.linkedin.com\/company\/refinery89\/\",\"https:\/\/www.youtube.com\/@refinery89\",\"https:\/\/www.instagram.com\/refinery_89\/\",\"https:\/\/www.reddit.com\/user\/Refinery89\/\",\"https:\/\/share.google\/K8hFf3ktmUrTi1XCa\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Infinite Scroll | Refinery89","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/refinery89.com\/pl\/docs\/ios-monetize-app-sdk-documentation\/user-manual\/formaty-reklam\/infinite-scroll\/","og_locale":"pl_PL","og_type":"article","og_title":"Infinite Scroll | Refinery89","og_description":"Prerequisites Display Ad Inside UITableView 1. Prepare the Item Cell 2. Prepare the UITableView 3. Prepare the UITableViewDelegate and UITableViewDataSource Lifecycle Events Prerequisites Get Started. The SDK provides a universal way to display advertisements inside the cell of scrollable controls, such as UITableView and UICollectionView. Keep in mind that the cell item should provide an [&hellip;]","og_url":"https:\/\/refinery89.com\/pl\/docs\/ios-monetize-app-sdk-documentation\/user-manual\/formaty-reklam\/infinite-scroll\/","og_site_name":"Refinery89","article_publisher":"https:\/\/www.facebook.com\/Refinery89\/","article_modified_time":"2024-08-27T15:56:27+00:00","og_image":[{"width":200,"height":200,"url":"https:\/\/refinery89.com\/wp-content\/uploads\/2025\/08\/r89-thumbnail.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_site":"@refinery89","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/refinery89.com\/pl\/docs\/ios-monetize-app-sdk-documentation\/user-manual\/formaty-reklam\/infinite-scroll\/","url":"https:\/\/refinery89.com\/pl\/docs\/ios-monetize-app-sdk-documentation\/user-manual\/formaty-reklam\/infinite-scroll\/","name":"Infinite Scroll | Refinery89","isPartOf":{"@id":"https:\/\/refinery89.com\/#website"},"datePublished":"2024-08-27T15:49:08+00:00","dateModified":"2024-08-27T15:56:27+00:00","breadcrumb":{"@id":"https:\/\/refinery89.com\/pl\/docs\/ios-monetize-app-sdk-documentation\/user-manual\/formaty-reklam\/infinite-scroll\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/refinery89.com\/pl\/docs\/ios-monetize-app-sdk-documentation\/user-manual\/formaty-reklam\/infinite-scroll\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/refinery89.com\/pl\/docs\/ios-monetize-app-sdk-documentation\/user-manual\/formaty-reklam\/infinite-scroll\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/refinery89.com\/"},{"@type":"ListItem","position":2,"name":"IOS &#8211; Monetize App SDK Documentation","item":"https:\/\/refinery89.com\/it\/docs\/ios-monetize-app-sdk-documentation\/"},{"@type":"ListItem","position":3,"name":"Privato: User Manual","item":"https:\/\/refinery89.com\/it\/"},{"@type":"ListItem","position":4,"name":"Ad Formats","item":"https:\/\/refinery89.com\/docs\/ios-monetize-app-sdk-documentation\/user-manual\/ad-formats\/"},{"@type":"ListItem","position":5,"name":"Infinite Scroll"}]},{"@type":"WebSite","@id":"https:\/\/refinery89.com\/#website","url":"https:\/\/refinery89.com\/","name":"Refinery89","description":"","publisher":{"@id":"https:\/\/refinery89.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/refinery89.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/refinery89.com\/#organization","name":"Refinery89","alternateName":"R89","url":"https:\/\/refinery89.com\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/refinery89.com\/#\/schema\/logo\/image\/","url":"https:\/\/refinery89.com\/wp-content\/uploads\/2025\/08\/r89-thumbnail.png","contentUrl":"https:\/\/refinery89.com\/wp-content\/uploads\/2025\/08\/r89-thumbnail.png","width":200,"height":200,"caption":"Refinery89"},"image":{"@id":"https:\/\/refinery89.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Refinery89\/","https:\/\/x.com\/refinery89","https:\/\/www.linkedin.com\/company\/refinery89\/","https:\/\/www.youtube.com\/@refinery89","https:\/\/www.instagram.com\/refinery_89\/","https:\/\/www.reddit.com\/user\/Refinery89\/","https:\/\/share.google\/K8hFf3ktmUrTi1XCa"]}]}},"comment_count":0,"_links":{"self":[{"href":"https:\/\/refinery89.com\/pl\/wp-json\/wp\/v2\/docs\/10828","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/refinery89.com\/pl\/wp-json\/wp\/v2\/docs"}],"about":[{"href":"https:\/\/refinery89.com\/pl\/wp-json\/wp\/v2\/types\/docs"}],"replies":[{"embeddable":true,"href":"https:\/\/refinery89.com\/pl\/wp-json\/wp\/v2\/comments?post=10828"}],"version-history":[{"count":0,"href":"https:\/\/refinery89.com\/pl\/wp-json\/wp\/v2\/docs\/10828\/revisions"}],"up":[{"embeddable":true,"href":"https:\/\/refinery89.com\/pl\/wp-json\/wp\/v2\/docs\/10819"}],"wp:attachment":[{"href":"https:\/\/refinery89.com\/pl\/wp-json\/wp\/v2\/media?parent=10828"}],"wp:term":[{"taxonomy":"doc_tag","embeddable":true,"href":"https:\/\/refinery89.com\/pl\/wp-json\/wp\/v2\/doc_tag?post=10828"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}