diff --git a/AltStore/App Detail/AppContentViewController.swift b/AltStore/App Detail/AppContentViewController.swift
index 33ddd9d5..fcdb9bfd 100644
--- a/AltStore/App Detail/AppContentViewController.swift
+++ b/AltStore/App Detail/AppContentViewController.swift
@@ -73,6 +73,8 @@ class AppContentViewController: UITableViewController
self.tableView.contentInset.bottom = 20
self.screenshotsCollectionView.dataSource = self.screenshotsDataSource
+ self.screenshotsCollectionView.prefetchDataSource = self.screenshotsDataSource
+
self.permissionsCollectionView.dataSource = self.permissionsDataSource
self.subtitleLabel.text = self.app.subtitle
diff --git a/AltStore/App Detail/AppViewController.swift b/AltStore/App Detail/AppViewController.swift
index d2b4ff5c..4593b84a 100644
--- a/AltStore/App Detail/AppViewController.swift
+++ b/AltStore/App Detail/AppViewController.swift
@@ -27,18 +27,11 @@ class AppViewController: UIViewController
@IBOutlet private var scrollView: UIScrollView!
@IBOutlet private var contentView: UIView!
- @IBOutlet private var headerView: UIView!
- @IBOutlet private var headerContentView: UIView!
+ @IBOutlet private var bannerView: AppBannerView!
@IBOutlet private var backButton: UIButton!
@IBOutlet private var backButtonContainerView: UIVisualEffectView!
- @IBOutlet private var nameLabel: UILabel!
- @IBOutlet private var developerLabel: UILabel!
- @IBOutlet private var downloadButton: PillButton!
- @IBOutlet private var appIconImageView: UIImageView!
- @IBOutlet private var betaBadgeView: UIImageView!
-
@IBOutlet private var backgroundAppIconImageView: UIImageView!
@IBOutlet private var backgroundBlurView: UIVisualEffectView!
@@ -75,21 +68,20 @@ class AppViewController: UIViewController
self.contentViewController.tableView.panGestureRecognizer.require(toFail: self.scrollView.panGestureRecognizer)
self.contentViewController.tableView.showsVerticalScrollIndicator = false
- self.headerView.frame = CGRect(x: 0, y: 0, width: 300, height: 93)
- self.headerView.layer.cornerRadius = 24
- self.headerView.layer.masksToBounds = true
-
// Bring to front so the scroll indicators are visible.
self.view.bringSubviewToFront(self.scrollView)
self.scrollView.isUserInteractionEnabled = false
- self.nameLabel.text = self.app.name
- self.developerLabel.text = self.app.developerName
- self.developerLabel.textColor = self.app.tintColor
- self.appIconImageView.image = nil
- self.appIconImageView.tintColor = self.app.tintColor
- self.downloadButton.tintColor = self.app.tintColor
- self.betaBadgeView.isHidden = !self.app.isBeta
+ self.bannerView.frame = CGRect(x: 0, y: 0, width: 300, height: 93)
+ self.bannerView.backgroundEffectView.effect = UIBlurEffect(style: .regular)
+ self.bannerView.backgroundEffectView.backgroundColor = .clear
+ self.bannerView.titleLabel.text = self.app.name
+ self.bannerView.subtitleLabel.text = self.app.developerName
+ self.bannerView.iconImageView.image = nil
+ self.bannerView.iconImageView.tintColor = self.app.tintColor
+ self.bannerView.button.tintColor = self.app.tintColor
+ self.bannerView.betaBadgeView.isHidden = !self.app.isBeta
+ self.bannerView.tintColor = self.app.tintColor
self.backButtonContainerView.tintColor = self.app.tintColor
@@ -112,7 +104,7 @@ class AppViewController: UIViewController
self._backgroundBlurTintColor = self.backgroundBlurView.contentView.backgroundColor
// Load Images
- for imageView in [self.appIconImageView!, self.backgroundAppIconImageView!, self.navigationBarAppIconImageView!]
+ for imageView in [self.bannerView.iconImageView!, self.backgroundAppIconImageView!, self.navigationBarAppIconImageView!]
{
imageView.isIndicatingActivity = true
@@ -130,10 +122,6 @@ class AppViewController: UIViewController
super.viewWillAppear(animated)
self.prepareBlur()
-
- // Update blur immediately.
- self.view.setNeedsLayout()
- self.view.layoutIfNeeded()
self.transitionCoordinator?.animate(alongsideTransition: { (context) in
self.hideNavigationBar()
@@ -219,7 +207,7 @@ class AppViewController: UIViewController
var backButtonFrame = CGRect(x: inset, y: statusBarHeight,
width: backButtonSize.width + 20, height: backButtonSize.height + 20)
- var headerFrame = CGRect(x: inset, y: 0, width: self.view.bounds.width - inset * 2, height: self.headerView.bounds.height)
+ var headerFrame = CGRect(x: inset, y: 0, width: self.view.bounds.width - inset * 2, height: self.bannerView.bounds.height)
var contentFrame = CGRect(x: 0, y: 0, width: self.view.bounds.width, height: self.view.bounds.height)
var backgroundIconFrame = CGRect(x: 0, y: 0, width: self.view.bounds.width, height: self.view.bounds.width)
@@ -305,12 +293,11 @@ class AppViewController: UIViewController
// Set frames.
self.contentViewController.view.superview?.frame = contentFrame
- self.headerView.frame = headerFrame
+ self.bannerView.frame = headerFrame
self.backgroundAppIconImageView.frame = backgroundIconFrame
self.backgroundBlurView.frame = backgroundIconFrame
self.backButtonContainerView.frame = backButtonFrame
- self.headerContentView.frame = CGRect(x: 0, y: 0, width: self.headerView.bounds.width, height: self.headerView.bounds.height)
self.contentViewControllerShadowView.frame = self.contentViewController.view.frame
self.backButtonContainerView.layer.cornerRadius = self.backButtonContainerView.bounds.midY
@@ -325,6 +312,8 @@ class AppViewController: UIViewController
self.scrollView.contentSize = contentSize
self.scrollView.contentOffset = contentOffset
+
+ self.bannerView.backgroundEffectView.backgroundColor = .clear
}
deinit
@@ -350,7 +339,7 @@ private extension AppViewController
{
func update()
{
- for button in [self.downloadButton!, self.navigationBarDownloadButton!]
+ for button in [self.bannerView.button!, self.navigationBarDownloadButton!]
{
button.tintColor = self.app.tintColor
button.isIndicatingActivity = false
@@ -372,12 +361,12 @@ private extension AppViewController
if Date() < self.app.versionDate
{
- self.downloadButton.countdownDate = self.app.versionDate
+ self.bannerView.button.countdownDate = self.app.versionDate
self.navigationBarDownloadButton.countdownDate = self.app.versionDate
}
else
{
- self.downloadButton.countdownDate = nil
+ self.bannerView.button.countdownDate = nil
self.navigationBarDownloadButton.countdownDate = nil
}
@@ -491,12 +480,14 @@ extension AppViewController
}
DispatchQueue.main.async {
- self.downloadButton.progress = nil
+ self.bannerView.button.progress = nil
+ self.navigationBarDownloadButton.progress = nil
self.update()
}
}
- self.downloadButton.progress = progress
+ self.bannerView.button.progress = progress
+ self.navigationBarDownloadButton.progress = progress
}
func open(_ installedApp: InstalledApp)
diff --git a/AltStore/Base.lproj/Main.storyboard b/AltStore/Base.lproj/Main.storyboard
index 8e392304..2a44a4f2 100644
--- a/AltStore/Base.lproj/Main.storyboard
+++ b/AltStore/Base.lproj/Main.storyboard
@@ -6,7 +6,6 @@
-
@@ -124,69 +123,10 @@
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -248,18 +188,12 @@
-
-
+
-
-
-
-
-
@@ -612,10 +546,10 @@ World
-
+
-
+
@@ -845,13 +779,12 @@ World
-
-
+
diff --git a/AltStore/News/NewsCollectionViewCell.swift b/AltStore/News/NewsCollectionViewCell.swift
index adf9ba18..d9c4b276 100644
--- a/AltStore/News/NewsCollectionViewCell.swift
+++ b/AltStore/News/NewsCollectionViewCell.swift
@@ -13,13 +13,16 @@ class NewsCollectionViewCell: UICollectionViewCell
@IBOutlet var titleLabel: UILabel!
@IBOutlet var captionLabel: UILabel!
@IBOutlet var imageView: UIImageView!
+ @IBOutlet var contentBackgroundView: UIView!
override func awakeFromNib()
{
super.awakeFromNib()
- self.contentView.layer.cornerRadius = 30
- self.contentView.clipsToBounds = true
+ self.contentView.preservesSuperviewLayoutMargins = true
+
+ self.contentBackgroundView.layer.cornerRadius = 30
+ self.contentBackgroundView.clipsToBounds = true
self.imageView.layer.cornerRadius = 30
self.imageView.clipsToBounds = true
diff --git a/AltStore/News/NewsCollectionViewCell.xib b/AltStore/News/NewsCollectionViewCell.xib
index 0b29532b..42ec35d6 100644
--- a/AltStore/News/NewsCollectionViewCell.xib
+++ b/AltStore/News/NewsCollectionViewCell.xib
@@ -1,11 +1,9 @@
-
-
-
-
+
+
-
+
@@ -18,23 +16,26 @@
-
-
+
+
+
+
+
-
+
-
+
-
-
+
-
+
@@ -63,15 +64,21 @@
-
-
+
+
+
+
+
+
+
+
diff --git a/AltStore/News/NewsViewController.swift b/AltStore/News/NewsViewController.swift
index 9e0ca0a3..a0712bca 100644
--- a/AltStore/News/NewsViewController.swift
+++ b/AltStore/News/NewsViewController.swift
@@ -22,8 +22,17 @@ private class AppBannerFooterView: UICollectionReusableView
{
super.init(frame: frame)
- self.addSubview(self.bannerView, pinningEdgesWith: UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20))
self.addGestureRecognizer(self.tapGestureRecognizer)
+
+ self.bannerView.translatesAutoresizingMaskIntoConstraints = false
+ self.addSubview(self.bannerView)
+
+ NSLayoutConstraint.activate([
+ self.bannerView.topAnchor.constraint(equalTo: self.topAnchor),
+ self.bannerView.bottomAnchor.constraint(equalTo: self.bottomAnchor),
+ self.bannerView.leadingAnchor.constraint(equalTo: self.layoutMarginsGuide.leadingAnchor),
+ self.bannerView.trailingAnchor.constraint(equalTo: self.layoutMarginsGuide.trailingAnchor)
+ ])
}
required init?(coder aDecoder: NSCoder) {
@@ -52,7 +61,6 @@ class NewsViewController: UICollectionViewController
super.viewDidLoad()
self.prototypeCell = NewsCollectionViewCell.instantiate(with: NewsCollectionViewCell.nib!)
- self.prototypeCell.translatesAutoresizingMaskIntoConstraints = false
self.prototypeCell.contentView.translatesAutoresizingMaskIntoConstraints = false
self.collectionView.dataSource = self.dataSource
@@ -93,15 +101,18 @@ private extension NewsViewController
let fetchRequest = NewsItem.fetchRequest() as NSFetchRequest
fetchRequest.sortDescriptors = [NSSortDescriptor(keyPath: \NewsItem.sortIndex, ascending: false)]
- let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: DatabaseManager.shared.viewContext, sectionNameKeyPath: #keyPath(NewsItem.date), cacheName: nil)
+ let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: DatabaseManager.shared.viewContext, sectionNameKeyPath: #keyPath(NewsItem.sortIndex), cacheName: nil)
let dataSource = RSTFetchedResultsCollectionViewPrefetchingDataSource(fetchedResultsController: fetchedResultsController)
dataSource.proxy = self
dataSource.cellConfigurationHandler = { (cell, newsItem, indexPath) in
let cell = cell as! NewsCollectionViewCell
+ cell.layoutMargins.left = self.view.layoutMargins.left
+ cell.layoutMargins.right = self.view.layoutMargins.right
+
cell.titleLabel.text = newsItem.title
cell.captionLabel.text = newsItem.caption
- cell.contentView.backgroundColor = newsItem.tintColor
+ cell.contentBackgroundView.backgroundColor = newsItem.tintColor
cell.imageView.image = nil
@@ -315,6 +326,9 @@ extension NewsViewController
let footerView = collectionView.dequeueReusableSupplementaryView(ofKind: UICollectionView.elementKindSectionFooter, withReuseIdentifier: "AppBanner", for: indexPath) as! AppBannerFooterView
guard let storeApp = item.storeApp else { return footerView }
+ footerView.layoutMargins.left = self.view.layoutMargins.left
+ footerView.layoutMargins.right = self.view.layoutMargins.right
+
footerView.bannerView.titleLabel.text = storeApp.name
footerView.bannerView.subtitleLabel.text = storeApp.developerName
footerView.bannerView.tintColor = storeApp.tintColor
@@ -358,10 +372,7 @@ extension NewsViewController
extension NewsViewController: UICollectionViewDelegateFlowLayout
{
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
- {
- let padding = 40 as CGFloat
- let width = collectionView.bounds.width - padding
-
+ {
let item = self.dataSource.item(at: indexPath)
if let previousSize = self.cachedCellSizes[item.identifier]
@@ -369,7 +380,7 @@ extension NewsViewController: UICollectionViewDelegateFlowLayout
return previousSize
}
- let widthConstraint = self.prototypeCell.contentView.widthAnchor.constraint(equalToConstant: width)
+ let widthConstraint = self.prototypeCell.contentView.widthAnchor.constraint(equalToConstant: collectionView.bounds.width)
NSLayoutConstraint.activate([widthConstraint])
defer { NSLayoutConstraint.deactivate([widthConstraint]) }
@@ -396,7 +407,7 @@ extension NewsViewController: UICollectionViewDelegateFlowLayout
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets
{
- var insets = UIEdgeInsets(top: 30, left: 20, bottom: 13, right: 20)
+ var insets = UIEdgeInsets(top: 30, left: 0, bottom: 13, right: 0)
if section == 0
{