Skip to content

Commit f94c667

Browse files
committed
Extract the filter to it's own view
1 parent 8b6d3fa commit f94c667

3 files changed

Lines changed: 72 additions & 44 deletions

File tree

WordPress/Classes/ViewRelated/Activity/ActivityListViewController.swift

Lines changed: 5 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class ActivityListViewController: UIViewController, TableViewContainer, ImmuTabl
1414

1515
let containerStackView = UIStackView()
1616

17-
let filterStackView = UIStackView()
17+
let filterView = FilterBarView()
1818
let dateFilterChip = FilterChipButton()
1919
let activityTypeFilterChip = FilterChipButton()
2020

@@ -35,10 +35,6 @@ class ActivityListViewController: UIViewController, TableViewContainer, ImmuTabl
3535
fileprivate var viewModel: ActivityListViewModel
3636
private enum Constants {
3737
static let estimatedRowHeight: CGFloat = 62
38-
static let filterHeightAnchor: CGFloat = 24
39-
static let filterStackViewSpacing: CGFloat = 8
40-
static let filterBarHorizontalPadding: CGFloat = 16
41-
static let filterBarVerticalPadding: CGFloat = 8
4238
}
4339

4440
// MARK: - GUI
@@ -162,48 +158,13 @@ class ActivityListViewController: UIViewController, TableViewContainer, ImmuTabl
162158
}
163159

164160
private func setupFilterBar() {
165-
let filterIcon = UIImageView(image: UIImage.gridicon(.filter))
166-
filterIcon.tintColor = .listIcon
167-
filterIcon.heightAnchor.constraint(equalToConstant: Constants.filterHeightAnchor).isActive = true
168-
filterStackView.alignment = .center
169-
filterStackView.spacing = Constants.filterStackViewSpacing
170-
filterStackView.addArrangedSubview(filterIcon)
171-
let scrollView = UIScrollView()
172-
scrollView.canCancelContentTouches = true
173-
scrollView.showsHorizontalScrollIndicator = false
174-
filterStackView.addArrangedSubview(dateFilterChip)
175-
filterStackView.addArrangedSubview(activityTypeFilterChip)
176-
scrollView.addSubview(filterStackView)
177-
containerStackView.addArrangedSubview(scrollView)
178-
filterStackView.translatesAutoresizingMaskIntoConstraints = false
179-
NSLayoutConstraint.activate([
180-
filterStackView.leftAnchor.constraint(equalTo: scrollView.leftAnchor, constant: Constants.filterBarHorizontalPadding),
181-
filterStackView.rightAnchor.constraint(equalTo: scrollView.rightAnchor, constant: Constants.filterBarHorizontalPadding),
182-
filterStackView.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: Constants.filterBarVerticalPadding),
183-
filterStackView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor, constant: Constants.filterBarVerticalPadding),
184-
scrollView.heightAnchor.constraint(equalTo: filterStackView.heightAnchor, constant: 2 * Constants.filterBarVerticalPadding)
185-
])
186-
187-
// Ensure that the stackview is right aligned in RTL layouts
188-
if view.userInterfaceLayoutDirection() == .rightToLeft {
189-
scrollView.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi))
190-
filterStackView.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi))
191-
}
161+
containerStackView.addArrangedSubview(filterView)
192162

193-
setupDateFilter()
163+
filterView.add(button: dateFilterChip)
164+
filterView.add(button: activityTypeFilterChip)
194165

166+
setupDateFilter()
195167
setupActivityTypeFilter()
196-
197-
let separator = UIView()
198-
separator.translatesAutoresizingMaskIntoConstraints = false
199-
scrollView.addSubview(separator)
200-
NSLayoutConstraint.activate([
201-
separator.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor, constant: 16),
202-
separator.leftAnchor.constraint(equalTo: scrollView.leftAnchor),
203-
separator.widthAnchor.constraint(equalTo: scrollView.widthAnchor),
204-
separator.heightAnchor.constraint(equalToConstant: 1)
205-
])
206-
WPStyleGuide.applyBorderStyle(separator)
207168
}
208169

209170
private func setupDateFilter() {
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import UIKit
2+
3+
class FilterBarView: UIScrollView {
4+
let filterStackView = UIStackView()
5+
6+
override init(frame: CGRect) {
7+
super.init(frame: frame)
8+
9+
filterStackView.alignment = .center
10+
filterStackView.spacing = Constants.filterStackViewSpacing
11+
filterStackView.translatesAutoresizingMaskIntoConstraints = false
12+
13+
let filterIcon = UIImageView(image: UIImage.gridicon(.filter))
14+
filterIcon.tintColor = .listIcon
15+
filterIcon.heightAnchor.constraint(equalToConstant: Constants.filterHeightAnchor).isActive = true
16+
17+
filterStackView.addArrangedSubview(filterIcon)
18+
19+
canCancelContentTouches = true
20+
showsHorizontalScrollIndicator = false
21+
addSubview(filterStackView)
22+
23+
NSLayoutConstraint.activate([
24+
filterStackView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: Constants.filterBarHorizontalPadding),
25+
filterStackView.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -1 * Constants.filterBarHorizontalPadding),
26+
filterStackView.topAnchor.constraint(equalTo: topAnchor, constant: Constants.filterBarVerticalPadding),
27+
filterStackView.bottomAnchor.constraint(equalTo: bottomAnchor, constant: Constants.filterBarVerticalPadding),
28+
heightAnchor.constraint(equalTo: filterStackView.heightAnchor, constant: 2 * Constants.filterBarVerticalPadding)
29+
])
30+
31+
let separator = UIView()
32+
separator.translatesAutoresizingMaskIntoConstraints = false
33+
addSubview(separator)
34+
NSLayoutConstraint.activate([
35+
separator.bottomAnchor.constraint(equalTo: bottomAnchor, constant: 16),
36+
separator.leftAnchor.constraint(equalTo: leftAnchor),
37+
separator.widthAnchor.constraint(equalTo: widthAnchor),
38+
separator.heightAnchor.constraint(equalToConstant: 1)
39+
])
40+
WPStyleGuide.applyBorderStyle(separator)
41+
42+
// Ensure that the stackview is right aligned in RTL layouts
43+
if userInterfaceLayoutDirection() == .rightToLeft {
44+
transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi))
45+
filterStackView.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi))
46+
}
47+
}
48+
49+
required init?(coder aDecoder: NSCoder) {
50+
super.init(coder: aDecoder)
51+
}
52+
53+
func add(button chip: FilterChipButton) {
54+
filterStackView.addArrangedSubview(chip)
55+
}
56+
57+
private enum Constants {
58+
static let filterHeightAnchor: CGFloat = 24
59+
static let filterStackViewSpacing: CGFloat = 8
60+
static let filterBarHorizontalPadding: CGFloat = 16
61+
static let filterBarVerticalPadding: CGFloat = 8
62+
}
63+
}

WordPress/WordPress.xcodeproj/project.pbxproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1149,6 +1149,7 @@
11491149
8B25F8DA24B7683A009DD4C9 /* ReaderCSSTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B25F8D924B7683A009DD4C9 /* ReaderCSSTests.swift */; };
11501150
8B260D7E2444FC9D0010F756 /* PostVisibilitySelectorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B260D7D2444FC9D0010F756 /* PostVisibilitySelectorViewController.swift */; };
11511151
8B3DECAB2388506400A459C2 /* SentryStartupEvent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B3DECAA2388506400A459C2 /* SentryStartupEvent.swift */; };
1152+
8B51844525893F140085488D /* FilterBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B51844425893F140085488D /* FilterBarView.swift */; };
11521153
8B64B4B2247EC3A2009A1229 /* reader.css in Resources */ = {isa = PBXBuildFile; fileRef = 8B64B4B1247EC3A2009A1229 /* reader.css */; };
11531154
8B69F0E4255C2C3F006B1CEF /* ActivityListViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B69F0E3255C2C3F006B1CEF /* ActivityListViewModelTests.swift */; };
11541155
8B69F100255C4870006B1CEF /* ActivityStoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8B69F0FF255C4870006B1CEF /* ActivityStoreTests.swift */; };
@@ -3686,6 +3687,7 @@
36863687
8B25F8D924B7683A009DD4C9 /* ReaderCSSTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReaderCSSTests.swift; sourceTree = "<group>"; };
36873688
8B260D7D2444FC9D0010F756 /* PostVisibilitySelectorViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostVisibilitySelectorViewController.swift; sourceTree = "<group>"; };
36883689
8B3DECAA2388506400A459C2 /* SentryStartupEvent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SentryStartupEvent.swift; sourceTree = "<group>"; };
3690+
8B51844425893F140085488D /* FilterBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FilterBarView.swift; sourceTree = "<group>"; };
36893691
8B64B4B1247EC3A2009A1229 /* reader.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; path = reader.css; sourceTree = "<group>"; };
36903692
8B69F0E3255C2C3F006B1CEF /* ActivityListViewModelTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityListViewModelTests.swift; sourceTree = "<group>"; };
36913693
8B69F0FF255C4870006B1CEF /* ActivityStoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityStoreTests.swift; sourceTree = "<group>"; };
@@ -8181,6 +8183,7 @@
81818183
isa = PBXGroup;
81828184
children = (
81838185
8B93412E257029F50097D0AC /* FilterChipButton.swift */,
8186+
8B51844425893F140085488D /* FilterBarView.swift */,
81848187
);
81858188
path = Filter;
81868189
sourceTree = "<group>";
@@ -13000,6 +13003,7 @@
1300013003
46D6114F2555DAED00B0B7BB /* SiteCreationAnalyticsHelper.swift in Sources */,
1300113004
B54866CA1A0D7042004AC79D /* NSAttributedString+Helpers.swift in Sources */,
1300213005
C81CCD81243BF7A600A83E27 /* TenorService.swift in Sources */,
13006+
8B51844525893F140085488D /* FilterBarView.swift in Sources */,
1300313007
E105205B1F2B1CF400A948F6 /* BlogToBlogMigration_61_62.swift in Sources */,
1300413008
E16FB7E31F8B61040004DD9F /* WebKitViewController.swift in Sources */,
1300513009
3F8CBE0B24EEB0EA00F71234 /* AnnouncementsDataSource.swift in Sources */,

0 commit comments

Comments
 (0)