From d7e523bf401d901feddbf5b1a508e2328a90c1ba Mon Sep 17 00:00:00 2001 From: ChrisLi Date: Sat, 16 May 2020 11:45:22 -0400 Subject: [PATCH] More icon update and a couple of small issues (#252) * update logo icon * faviconBackground color * prevent bottom bar from being visible after switching size class when search is active * changelog * search result list always top when appearing * search result list view color and tableview style * search result tableview cells * detail text label * tableview separator insets --- CHANGELOG.md | 4 + .../SearchOperation/SearchOperation.swift | 1 - Model/Parser.swift | 2 +- .../Kiwix.imageset/Contents.json | 14 +-- .../Kiwix.imageset/Kiwix_icon_transparent.pdf | Bin 16513 -> 0 bytes .../Kiwix.imageset/Kiwix_icon_transparent.svg | 71 ------------- .../Kiwix.imageset/Kiwix_logo_v3.pdf | 70 +++++++++++++ .../Kiwix.imageset/Kiwix_logo_v3.svg | 20 ++++ .../faviconBackground.colorset/Contents.json | 31 ++++++ iOS/Controller/ContentViewController.swift | 2 + .../Library/LibraryCategoryController.swift | 4 +- .../Library/LibraryMasterController.swift | 3 +- .../LibraryZimFileDetailController.swift | 1 + iOS/Controller/RootController.swift | 4 +- .../Search/SearchFilterController.swift | 2 + .../Search/SearchResultsController.swift | 6 +- .../Search/SearchResultsListController.swift | 29 ++---- iOS/View/TableViewCell.swift | 96 ++++++++++++------ 18 files changed, 222 insertions(+), 138 deletions(-) delete mode 100644 iOS/Assets.xcassets/Kiwix.imageset/Kiwix_icon_transparent.pdf delete mode 100644 iOS/Assets.xcassets/Kiwix.imageset/Kiwix_icon_transparent.svg create mode 100644 iOS/Assets.xcassets/Kiwix.imageset/Kiwix_logo_v3.pdf create mode 100644 iOS/Assets.xcassets/Kiwix.imageset/Kiwix_logo_v3.svg create mode 100644 iOS/Assets.xcassets/faviconBackground.colorset/Contents.json diff --git a/CHANGELOG.md b/CHANGELOG.md index 7739ed6d..13e5e1a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ Speed improvements and more options for search snippets: - First Sentence: from first paragraph, further extract the first sentence with iOS natural language processing engine - Matches: highlight search term matches in the article (slowest, what we offer before) +New: + +- updated app icon + Bug fixes: - fix: swipe back gesture was not working due to conflict with gesture to show sidebar diff --git a/Model/Operations/SearchOperation/SearchOperation.swift b/Model/Operations/SearchOperation/SearchOperation.swift index 62d58f4a..8437db29 100644 --- a/Model/Operations/SearchOperation/SearchOperation.swift +++ b/Model/Operations/SearchOperation/SearchOperation.swift @@ -12,7 +12,6 @@ import SwiftyUserDefaults extension SearchOperation { var results: [SearchResult] { get { __results as? [SearchResult] ?? [] } } - static private let boldFont = NSUIFont.boldSystemFont(ofSize: 12.0) open override func main() { let mode = SearchResultSnippetMode(rawValue: Defaults[.searchResultSnippetMode]) ?? SearchResultSnippetMode.disabled diff --git a/Model/Parser.swift b/Model/Parser.swift index 2b5768ff..88279e3a 100644 --- a/Model/Parser.swift +++ b/Model/Parser.swift @@ -16,7 +16,7 @@ class Parser { private let document: Document private lazy var firstParagraph: Element? = try? document.body()?.getElementsByTag("p").first() - static private let boldFont = NSUIFont.boldSystemFont(ofSize: 12.0) + static private let boldFont = NSUIFont.systemFont(ofSize: 12.0, weight: .medium) init(document: Document) { self.document = document diff --git a/iOS/Assets.xcassets/Kiwix.imageset/Contents.json b/iOS/Assets.xcassets/Kiwix.imageset/Contents.json index 8048b628..c9061dc0 100644 --- a/iOS/Assets.xcassets/Kiwix.imageset/Contents.json +++ b/iOS/Assets.xcassets/Kiwix.imageset/Contents.json @@ -1,16 +1,16 @@ { "images" : [ { - "idiom" : "universal", - "filename" : "Kiwix_icon_transparent.pdf" + "filename" : "Kiwix_logo_v3.pdf", + "idiom" : "universal" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 }, "properties" : { - "template-rendering-intent" : "template", - "preserves-vector-representation" : true + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" } -} \ No newline at end of file +} diff --git a/iOS/Assets.xcassets/Kiwix.imageset/Kiwix_icon_transparent.pdf b/iOS/Assets.xcassets/Kiwix.imageset/Kiwix_icon_transparent.pdf deleted file mode 100644 index 38db0dcda31faba82f61ca2e42283a68e59fa916..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16513 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 diff --git a/iOS/Assets.xcassets/Kiwix.imageset/Kiwix_icon_transparent.svg b/iOS/Assets.xcassets/Kiwix.imageset/Kiwix_icon_transparent.svg deleted file mode 100644 index d87670c1..00000000 --- a/iOS/Assets.xcassets/Kiwix.imageset/Kiwix_icon_transparent.svg +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - diff --git a/iOS/Assets.xcassets/Kiwix.imageset/Kiwix_logo_v3.pdf b/iOS/Assets.xcassets/Kiwix.imageset/Kiwix_logo_v3.pdf new file mode 100644 index 00000000..f3778192 --- /dev/null +++ b/iOS/Assets.xcassets/Kiwix.imageset/Kiwix_logo_v3.pdf @@ -0,0 +1,70 @@ +%PDF-1.4 +% +4 0 obj +<< /Length 5 0 R + /Filter /FlateDecode +>> +stream +xmUKn9 )t(_:F0x$ {13HvFp?R"EV( x_\k%b?ߵCf0|Vxc0!c3O1rb2_#H&_CN3K_Aҽh*nSX3dTۧ_Q;Pr #t`J1(߬at6n5=k"[78|Q,VŸSsvyޡH6s\pr$""U!ݎqT]$d~ l+9UYf<7',F4AgA̍q'kriO[,6Taq + ^لWp= +uaPyYŒc>֍Ys fk ۓt}nb-QLAg?Z„XX[ndDJTzg?3 Rֱ#Cn=qdE)6vi *ґTSyXѵ[6R/$4 IDR}<4hd%rڤx㿯槕 +endstream +endobj +5 0 obj + 894 +endobj +3 0 obj +<< + /ExtGState << + /a0 << /CA 1 /ca 1 >> + >> +>> +endobj +2 0 obj +<< /Type /Page % 1 + /Parent 1 0 R + /MediaBox [ 0 0 942 942 ] + /Contents 4 0 R + /Group << + /Type /Group + /S /Transparency + /I true + /CS /DeviceRGB + >> + /Resources 3 0 R +>> +endobj +1 0 obj +<< /Type /Pages + /Kids [ 2 0 R ] + /Count 1 +>> +endobj +6 0 obj +<< /Producer (cairo 1.16.0 (https://cairographics.org)) + /CreationDate (D:20200513220958Z) +>> +endobj +7 0 obj +<< /Type /Catalog + /Pages 1 0 R +>> +endobj +xref +0 8 +0000000000 65535 f +0000001298 00000 n +0000001080 00000 n +0000001008 00000 n +0000000015 00000 n +0000000986 00000 n +0000001363 00000 n +0000001474 00000 n +trailer +<< /Size 8 + /Root 7 0 R + /Info 6 0 R +>> +startxref +1526 +%%EOF diff --git a/iOS/Assets.xcassets/Kiwix.imageset/Kiwix_logo_v3.svg b/iOS/Assets.xcassets/Kiwix.imageset/Kiwix_logo_v3.svg new file mode 100644 index 00000000..566b1064 --- /dev/null +++ b/iOS/Assets.xcassets/Kiwix.imageset/Kiwix_logo_v3.svg @@ -0,0 +1,20 @@ + + + + + + diff --git a/iOS/Assets.xcassets/faviconBackground.colorset/Contents.json b/iOS/Assets.xcassets/faviconBackground.colorset/Contents.json new file mode 100644 index 00000000..a5d8d6ef --- /dev/null +++ b/iOS/Assets.xcassets/faviconBackground.colorset/Contents.json @@ -0,0 +1,31 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "extended-gray", + "components" : { + "alpha" : "0.000", + "white" : "1.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "platform" : "ios", + "reference" : "systemFillColor" + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/iOS/Controller/ContentViewController.swift b/iOS/Controller/ContentViewController.swift index e6191129..60fbb250 100644 --- a/iOS/Controller/ContentViewController.swift +++ b/iOS/Controller/ContentViewController.swift @@ -29,6 +29,8 @@ class ContentViewController: UIViewController, UISearchControllerDelegate, WebVi private(set) lazy var welcomeController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "WelcomeController") as! WelcomeController private(set) lazy var libraryController = LibraryController() + // MARK:- Initialization + init() { self.searchResultsController = SearchResultsController() self.searchController = UISearchController(searchResultsController: self.searchResultsController) diff --git a/iOS/Controller/Library/LibraryCategoryController.swift b/iOS/Controller/Library/LibraryCategoryController.swift index ff86e7f5..47c2cf31 100644 --- a/iOS/Controller/Library/LibraryCategoryController.swift +++ b/iOS/Controller/Library/LibraryCategoryController.swift @@ -44,7 +44,9 @@ class LibraryCategoryController: UIViewController, UITableViewDataSource, UITabl tableView.delegate = self tableView.dataSource = self tableView.register(TableViewCell.self, forCellReuseIdentifier: "Cell") - tableView.separatorInset = UIEdgeInsets(top: 0, left: tableView.separatorInset.left + 42, bottom: 0, right: 0) + tableView.cellLayoutMarginsFollowReadableWidth = true + tableView.separatorInsetReference = .fromAutomaticInsets + tableView.separatorInset = UIEdgeInsets(top: 0, left: 40, bottom: 0, right: 0) } override func viewDidLoad() { diff --git a/iOS/Controller/Library/LibraryMasterController.swift b/iOS/Controller/Library/LibraryMasterController.swift index 357c5fed..35c340c1 100644 --- a/iOS/Controller/Library/LibraryMasterController.swift +++ b/iOS/Controller/Library/LibraryMasterController.swift @@ -56,7 +56,8 @@ class LibraryMasterController: UIViewController, UIDocumentPickerDelegate, UITab tableView.dataSource = self tableView.register(TableViewCell.self, forCellReuseIdentifier: "Cell") tableView.register(TableViewCell.self, forCellReuseIdentifier: "CategoryCell") - tableView.separatorInset = UIEdgeInsets(top: 0, left: tableView.separatorInset.left + 42, bottom: 0, right: 0) + tableView.separatorInsetReference = .fromAutomaticInsets + tableView.separatorInset = UIEdgeInsets(top: 0, left: 40, bottom: 0, right: 0) } override func viewDidLoad() { diff --git a/iOS/Controller/Library/LibraryZimFileDetailController.swift b/iOS/Controller/Library/LibraryZimFileDetailController.swift index f774fecd..aba37ffc 100644 --- a/iOS/Controller/Library/LibraryZimFileDetailController.swift +++ b/iOS/Controller/Library/LibraryZimFileDetailController.swift @@ -76,6 +76,7 @@ class LibraryZimFileDetailController: UIViewController, UITableViewDataSource, U view = tableView tableView.delegate = self tableView.dataSource = self + tableView.cellLayoutMarginsFollowReadableWidth = true tableView.register(UIRightDetailTableViewCell.self, forCellReuseIdentifier: "Cell") tableView.register(UIActionTableViewCell.self, forCellReuseIdentifier: "ActionCell") } diff --git a/iOS/Controller/RootController.swift b/iOS/Controller/RootController.swift index 9826cf65..7e8fb82c 100644 --- a/iOS/Controller/RootController.swift +++ b/iOS/Controller/RootController.swift @@ -72,7 +72,7 @@ class RootController: UISplitViewController, UISplitViewControllerDelegate, UIGe func primaryViewController(forCollapsing splitViewController: UISplitViewController) -> UIViewController? { contentViewController.configureToolbar(isGrouped: false) let navigationController = UINavigationController(rootViewController: contentViewController) - navigationController.isToolbarHidden = false + navigationController.isToolbarHidden = contentViewController.searchController.isActive return navigationController } @@ -80,7 +80,7 @@ class RootController: UISplitViewController, UISplitViewControllerDelegate, UIGe separateSecondaryFrom primaryViewController: UIViewController) -> UIViewController? { contentViewController.configureToolbar(isGrouped: true) let navigationController = UINavigationController(rootViewController: contentViewController) - navigationController.isToolbarHidden = false + navigationController.isToolbarHidden = contentViewController.searchController.isActive return navigationController } diff --git a/iOS/Controller/Search/SearchFilterController.swift b/iOS/Controller/Search/SearchFilterController.swift index c0b46830..073d2050 100644 --- a/iOS/Controller/Search/SearchFilterController.swift +++ b/iOS/Controller/Search/SearchFilterController.swift @@ -55,6 +55,8 @@ class SearchFilterController: UIViewController, UITableViewDelegate, UITableView tableView.cellLayoutMarginsFollowReadableWidth = true tableView.register(TableViewCell.self, forCellReuseIdentifier: "Cell") tableView.register(RecentSearchTableViewCell.self, forCellReuseIdentifier: "RecentSearchCell") + tableView.separatorInsetReference = .fromAutomaticInsets + tableView.separatorInset = UIEdgeInsets(top: 0, left: 40, bottom: 0, right: 0) } override func viewWillAppear(_ animated: Bool) { diff --git a/iOS/Controller/Search/SearchResultsController.swift b/iOS/Controller/Search/SearchResultsController.swift index 3591c140..48648f15 100644 --- a/iOS/Controller/Search/SearchResultsController.swift +++ b/iOS/Controller/Search/SearchResultsController.swift @@ -48,7 +48,11 @@ class SearchResultsController: UIViewController, UISearchResultsUpdating { override func loadView() { view = UIView() - view.backgroundColor = .groupTableViewBackground + if #available(iOS 13.0, *) { + view.backgroundColor = .systemBackground + } else { + view.backgroundColor = .white + } if #available(iOS 13, *) {} else { /* Prevent SearchResultsController view from being automatically hidden by UISearchController */ diff --git a/iOS/Controller/Search/SearchResultsListController.swift b/iOS/Controller/Search/SearchResultsListController.swift index ed8d0152..1292e166 100644 --- a/iOS/Controller/Search/SearchResultsListController.swift +++ b/iOS/Controller/Search/SearchResultsListController.swift @@ -16,21 +16,13 @@ class SearchResultsListController: UITableViewController { private(set) var results = [SearchResult]() private weak var clearResultTimer: Timer? - init() { - super.init(style: .grouped) - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - override func viewDidLoad() { super.viewDidLoad() - tableView.estimatedRowHeight = 44 - tableView.rowHeight = UITableView.automaticDimension tableView.cellLayoutMarginsFollowReadableWidth = true - tableView.register(TableViewCell.self, forCellReuseIdentifier: "Cell") + tableView.register(SearchResultTableViewCell.self, forCellReuseIdentifier: "Cell") tableView.keyboardDismissMode = .onDrag + tableView.separatorInsetReference = .fromAutomaticInsets + tableView.separatorInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 0) } func update(searchText: String, zimFileIDs: Set, results: [SearchResult]) { @@ -38,6 +30,9 @@ class SearchResultsListController: UITableViewController { self.zimFileIDs = zimFileIDs self.results = results tableView.reloadData() + if !results.isEmpty { + tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: false) + } } func update(recentSearchText newSearchText: String) { @@ -75,7 +70,7 @@ class SearchResultsListController: UITableViewController { } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! TableViewCell + let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! SearchResultTableViewCell let result = results[indexPath.row] cell.titleLabel.text = result.title @@ -86,9 +81,9 @@ class SearchResultsListController: UITableViewController { cell.thumbImageView.contentMode = .scaleAspectFit } catch {} + cell.titleLabel.font = UIFont.systemFont(ofSize: 16, weight: .medium) if let snippet = result.snippet { cell.detailLabel.attributedText = snippet - cell.detailLabel.numberOfLines = 4 } return cell @@ -101,12 +96,4 @@ class SearchResultsListController: UITableViewController { content.searchController.dismiss(animated: true) content.searchController.isActive = false } - - override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat { - if results[indexPath.row].snippet != nil { - return traitCollection.horizontalSizeClass == .regular ? 120 : 190 - } else { - return 44 - } - } } diff --git a/iOS/View/TableViewCell.swift b/iOS/View/TableViewCell.swift index 09e3c8f3..a53ad924 100644 --- a/iOS/View/TableViewCell.swift +++ b/iOS/View/TableViewCell.swift @@ -13,7 +13,7 @@ class TableViewCell: UITableViewCell { let detailLabel = UILabel() let thumbImageView = UIImageView() let thumbImageBackgroundView = UIView() - private let textStackView = UIStackView() + fileprivate let textStackView = UIStackView() private var configuredConstraints = false override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { @@ -36,7 +36,41 @@ class TableViewCell: UITableViewCell { override func updateConstraints() { defer { super.updateConstraints() } guard !configuredConstraints else { return } + configureConstraints() + configuredConstraints = true + } + + fileprivate func configure() { + titleLabel.setContentHuggingPriority(UILayoutPriority(250), for: .vertical) + detailLabel.setContentHuggingPriority(UILayoutPriority(251), for: .vertical) + titleLabel.setContentCompressionResistancePriority(UILayoutPriority(750), for: .vertical) + detailLabel.setContentCompressionResistancePriority(UILayoutPriority(749), for: .vertical) + detailLabel.numberOfLines = 4 + detailLabel.font = UIFont.systemFont(ofSize: 12, weight: .regular) + thumbImageView.clipsToBounds = true + thumbImageView.layer.cornerRadius = 4 + thumbImageBackgroundView.clipsToBounds = true + thumbImageBackgroundView.layer.cornerRadius = 6 + if #available(iOS 13.0, *) { + thumbImageBackgroundView.backgroundColor = UIColor(named: "faviconBackground") + } else { + thumbImageBackgroundView.backgroundColor = .groupTableViewBackground + } + textStackView.axis = .vertical + textStackView.alignment = .leading + textStackView.distribution = .fill + textStackView.addArrangedSubview(titleLabel) + textStackView.addArrangedSubview(detailLabel) + + [thumbImageBackgroundView, thumbImageView, textStackView].forEach({ + $0.translatesAutoresizingMaskIntoConstraints = false + contentView.addSubview($0) + }) + setNeedsUpdateConstraints() + } + + fileprivate func configureConstraints() { NSLayoutConstraint.activate([ thumbImageView.heightAnchor.constraint(equalToConstant: 32), thumbImageView.widthAnchor.constraint(equalToConstant: 32), @@ -49,42 +83,40 @@ class TableViewCell: UITableViewCell { textStackView.leftAnchor.constraint(equalTo: thumbImageView.rightAnchor, constant: 8), textStackView.rightAnchor.constraint(equalTo: contentView.readableContentGuide.rightAnchor), textStackView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 6), - textStackView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -6)]) + textStackView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -6), + ]) let heightConstraint = contentView.heightAnchor.constraint(greaterThanOrEqualToConstant: 44) heightConstraint.priority = .defaultHigh heightConstraint.isActive = true - - configuredConstraints = true + } +} + +class SearchResultTableViewCell: TableViewCell { + private let thumbImageCornerRadius: CGFloat = 4 + private let thumbImageBackgroundViewCornerRadius: CGFloat = 6 + + override fileprivate func configure() { + super.configure() + thumbImageView.layer.cornerRadius = 3 + thumbImageBackgroundView.layer.cornerRadius = 3 } - private func configure() { - titleLabel.setContentHuggingPriority(UILayoutPriority(250), for: .vertical) - detailLabel.setContentHuggingPriority(UILayoutPriority(251), for: .vertical) - titleLabel.setContentCompressionResistancePriority(UILayoutPriority(750), for: .vertical) - detailLabel.setContentCompressionResistancePriority(UILayoutPriority(749), for: .vertical) - detailLabel.numberOfLines = 0 - detailLabel.font = UIFont.systemFont(ofSize: 12, weight: UIFont.Weight.regular) - thumbImageView.clipsToBounds = true - thumbImageView.layer.cornerRadius = 4 - if #available(iOS 13.0, *) { - thumbImageBackgroundView.backgroundColor = .quaternarySystemFill - } else { - thumbImageBackgroundView.backgroundColor = .groupTableViewBackground - } - thumbImageBackgroundView.clipsToBounds = true - thumbImageBackgroundView.layer.cornerRadius = 6 - - textStackView.axis = .vertical - textStackView.alignment = .leading - textStackView.distribution = .fill - textStackView.addArrangedSubview(titleLabel) - textStackView.addArrangedSubview(detailLabel) - - [thumbImageBackgroundView, thumbImageView, textStackView].forEach({ - $0.translatesAutoresizingMaskIntoConstraints = false - contentView.addSubview($0) - }) - setNeedsUpdateConstraints() + override fileprivate func configureConstraints() { + NSLayoutConstraint.activate([ + thumbImageView.leftAnchor.constraint(equalTo: contentView.readableContentGuide.leftAnchor, constant: -4), + thumbImageView.centerYAnchor.constraint(equalTo: titleLabel.centerYAnchor), + thumbImageView.widthAnchor.constraint(equalToConstant: 18), + thumbImageView.heightAnchor.constraint(equalToConstant: 18), + thumbImageBackgroundView.heightAnchor.constraint(equalToConstant: 20), + thumbImageBackgroundView.widthAnchor.constraint(equalToConstant: 20), + thumbImageBackgroundView.centerXAnchor.constraint(equalTo: thumbImageView.centerXAnchor), + thumbImageBackgroundView.centerYAnchor.constraint(equalTo: thumbImageView.centerYAnchor), + textStackView.leftAnchor.constraint(equalTo: thumbImageView.rightAnchor, constant: 6), + textStackView.rightAnchor.constraint(equalTo: contentView.readableContentGuide.rightAnchor), + textStackView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: 6), + textStackView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -6), + contentView.heightAnchor.constraint(greaterThanOrEqualToConstant: 44), + ]) } }