This content originally appeared on DEV Community and was authored by Anis Ali Khan
Build a Magazine-Style News Reader App in Swift
Author: Anis Ali Khan
Duration: ~1 hour
Level: Intermediate
Table of Contents
-
Introduction
-
Project Setup
-
Understanding UICollectionView
-
Designing the News Layout
-
Creating the Data Model
-
Setting Up the Collection View
-
Implementing Compositional Layout
-
Adding Custom Cells
-
Fetching & Displaying News Data
-
Adding Animations & Interactions
-
Testing & Debugging
-
Final Thoughts
1⃣ Introduction
Welcome to this tutorial! Today, weβre building a Magazine-Style News Reader App using UICollectionViewCompositionalLayout in Swift.
What Youβll Learn:
The basics of
UICollectionView
How to use
UICollectionViewCompositionalLayout
for complex grid designs
How to create dynamic, multi-section layouts
How to fetch and display real-world news data
How to add animations & interactions
Let’s get started!
2⃣ Project Setup
Step 1: Create a New Xcode Project
- Open Xcode β Click “Create a new Xcode project”
- Select App β Click Next
- Name it: MagazineReader
- Set Interface to Storyboard (or SwiftUI if preferred)
- Set Language to Swift
- Click Next β Choose a folder β Click Create
Step 2: Add Required Dependencies
Weβll use URLSession for network calls, but if you prefer, you can add Alamofire via Swift Package Manager (SPM).
3⃣ Understanding UICollectionView
UICollectionView
is a powerful class for building grid-based and custom layouts. It consists of:
- Cells β Individual content blocks
- Sections β Groupings of cells
- Layouts β Defines how cells are positioned
UICollectionViewCompositionalLayout vs Traditional Layouts
Feature | Flow Layout | Compositional Layout |
---|---|---|
Simplicity | ![]() |
![]() |
Flexibility | ![]() |
![]() |
Performance | ![]() |
![]() |
Since we want a magazine-style grid, weβll use UICollectionViewCompositionalLayout
.
4⃣ Designing the News Layout
Our layout will have:
Featured News (Large Cells) β 1 large article at the top
Trending News (Grid Cells) β 2 articles side by side
Latest News (List Cells) β Scrolling list of articles
5⃣ Creating the Data Model
Create NewsItem.swift
import Foundation
struct NewsItem: Identifiable {
let id = UUID()
let title: String
let description: String
let imageURL: String
}
6⃣ Setting Up the Collection View
Step 1: Add UICollectionView to ViewController
- Open Main.storyboard
- Drag a
UICollectionView
into the ViewController - Set constraints to fill parent view
- Create an IBOutlet in
ViewController.swift
:
@IBOutlet weak var collectionView: UICollectionView!
Step 2: Register Cell Classes
collectionView.register(NewsCell.self, forCellWithReuseIdentifier: "NewsCell")
collectionView.register(FeaturedNewsCell.self, forCellWithReuseIdentifier: "FeaturedNewsCell")
7⃣ Implementing Compositional Layout
Step 1: Define Section Layouts
func createLayout() -> UICollectionViewCompositionalLayout {
return UICollectionViewCompositionalLayout { sectionIndex, _ in
switch sectionIndex {
case 0:
return self.createFeaturedLayout()
case 1:
return self.createTrendingLayout()
default:
return self.createListLayout()
}
}
}
8⃣ Adding Custom Cells
Step 1: Create NewsCell.swift
import UIKit
class NewsCell: UICollectionViewCell {
static let identifier = "NewsCell"
let imageView = UIImageView()
let titleLabel = UILabel()
override init(frame: CGRect) {
super.init(frame: frame)
setupViews()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func setupViews() {
contentView.addSubview(imageView)
contentView.addSubview(titleLabel)
// Set constraints
}
}
9⃣ Fetching & Displaying News Data
func fetchNews() {
let url = URL(string: "https://example.com/api/news")!
URLSession.shared.dataTask(with: url) { data, _, error in
if let data = data {
// Decode JSON and update collectionView
}
}.resume()
}
Final Thoughts
You’ve successfully built a Magazine-Style News Reader App using UICollectionViewCompositionalLayout
!
Next Steps:
- Fetch real-world news using NewsAPI.org
- Add Dark Mode Support
- Implement Offline Caching
Happy coding!
This content originally appeared on DEV Community and was authored by Anis Ali Khan