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 {