diff --git a/Kiwix-iOS/Info.plist b/Kiwix-iOS/Info.plist index f30c76a4..3752cd93 100644 --- a/Kiwix-iOS/Info.plist +++ b/Kiwix-iOS/Info.plist @@ -49,7 +49,7 @@ CFBundleVersion - 1.7.544 + 1.7.643 ITSAppUsesNonExemptEncryption LSRequiresIPhoneOS diff --git a/Kiwix-iOS/Storyboard/Setting.storyboard b/Kiwix-iOS/Storyboard/Setting.storyboard index 7ddf5f52..60329dda 100644 --- a/Kiwix-iOS/Storyboard/Setting.storyboard +++ b/Kiwix-iOS/Storyboard/Setting.storyboard @@ -59,6 +59,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -554,7 +593,7 @@ - + diff --git a/Kiwix-iOSWidgets/Bookmarks/Base.lproj/MainInterface.storyboard b/Kiwix-iOSWidgets/Bookmarks/Base.lproj/MainInterface.storyboard index 7fd6a719..97c385fe 100644 --- a/Kiwix-iOSWidgets/Bookmarks/Base.lproj/MainInterface.storyboard +++ b/Kiwix-iOSWidgets/Bookmarks/Base.lproj/MainInterface.storyboard @@ -18,7 +18,7 @@ - + diff --git a/Kiwix-iOSWidgets/Bookmarks/TodayViewController.swift b/Kiwix-iOSWidgets/Bookmarks/TodayViewController.swift index 046eb72e..3d9dbee1 100644 --- a/Kiwix-iOSWidgets/Bookmarks/TodayViewController.swift +++ b/Kiwix-iOSWidgets/Bookmarks/TodayViewController.swift @@ -13,13 +13,11 @@ class TodayViewController: UIViewController, NCWidgetProviding, UICollectionView @IBOutlet weak var collectionView: UICollectionView! - private var rowHeight: CGFloat = 110.0 private let hInset: CGFloat = 15.0 private let vInset: CGFloat = 10.0 - private var itemHeight: CGFloat = 0.0 - private var itemWidth: CGFloat = 0.0 + private var itemSize = CGSizeZero - private var hasUpdate = false + private var hasUpdate = true private var bookmarks = [NSDictionary]() override func viewDidLoad() { @@ -28,15 +26,52 @@ class TodayViewController: UIViewController, NCWidgetProviding, UICollectionView collectionView.delegate = self updateData() + calculateItemSize(collectionViewWidth: collectionView.frame.width) updateUI() } override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) updateData() + calculateItemSize(collectionViewWidth: collectionView.frame.width) updateUI() } + override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { + super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) + calculateItemSize(collectionViewWidth: size.width) + updateUI() + } + + // MARK: - Update & Calculation + + func updateData() { + let defaults = NSUserDefaults(suiteName: "group.kiwix") + guard let bookmarks = defaults?.objectForKey("bookmarks") as? [NSDictionary] else {return} + hasUpdate = self.bookmarks != bookmarks + self.bookmarks = bookmarks + } + + func updateUI() { + collectionView.reloadData() + collectionView.collectionViewLayout.invalidateLayout() + NCWidgetController.widgetController().setHasContent(bookmarks.count > 0, forWidgetWithBundleIdentifier: "self.Kiwix.Bookmarks") + } + + func calculateItemSize(collectionViewWidth collectionViewWidth: CGFloat) { + let itemsPerRow = max(5, min(round(collectionViewWidth / 70), 10)) + let itemWidth = (collectionViewWidth - (itemsPerRow + 1) * hInset) / itemsPerRow + let titles = bookmarks.flatMap({$0.objectForKey("title") as? String}) + let labelHeights = titles.map({$0.heightWithConstrainedWidth(itemWidth, font: UIFont.systemFontOfSize(10.0, weight: UIFontWeightMedium))}) + let labelMaxHeight = max(12.0, min((labelHeights.maxElement() ?? 12.0), 24.0)) + let itemHeight = itemWidth + 2.0 + labelMaxHeight // itemHeight (1:1 ration) + label top spacing + label height + itemSize = CGSizeMake(itemWidth, itemHeight) + + let rowCount = ceil(CGFloat(bookmarks.count) / CGFloat(itemsPerRow)) + let collectionViewHeight = itemHeight * rowCount + hInset * rowCount + preferredContentSize = CGSizeMake(0, max(1, collectionViewHeight)) + } + // MARK: - NCWidgetProviding func widgetMarginInsetsForProposedMarginInsets(defaultMarginInsets: UIEdgeInsets) -> UIEdgeInsets { @@ -45,31 +80,12 @@ class TodayViewController: UIViewController, NCWidgetProviding, UICollectionView func widgetPerformUpdateWithCompletionHandler(completionHandler: ((NCUpdateResult) -> Void)) { updateData() + calculateItemSize(collectionViewWidth: collectionView.frame.width) updateUI() completionHandler(hasUpdate ? .NewData : .NoData) hasUpdate = false } - func updateData() { - let defaults = NSUserDefaults(suiteName: "group.kiwix") - guard let bookmarks = defaults?.objectForKey("bookmarks") as? [NSDictionary] else {return} - hasUpdate = self.bookmarks != bookmarks - self.bookmarks = bookmarks - } - - func updateUI() { - itemWidth = (collectionView.frame.width - 6 * hInset) / 5 - let titles = bookmarks.flatMap({$0.objectForKey("title") as? String}) - let labelHeights = titles.map({$0.heightWithConstrainedWidth(itemWidth, font: UIFont.systemFontOfSize(10.0, weight: UIFontWeightMedium))}) - let labelMaxHeight = max(12.0, min((labelHeights.maxElement() ?? 12.0), 24.0)) - itemHeight = itemWidth + 2.0 + labelMaxHeight // itemHeight (1:1 ration) + label top spacing + label height - - let rowCount: CGFloat = ceil(CGFloat(bookmarks.count) / 5) - let collectionViewHeight = rowCount * itemHeight + vInset * (rowCount + 1) - preferredContentSize = CGSizeMake(collectionView.frame.width, collectionViewHeight) - collectionView.reloadData() - } - // MARK: - UICollectionViewDataSource func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { @@ -110,7 +126,7 @@ class TodayViewController: UIViewController, NCWidgetProviding, UICollectionView // MARK: - UICollectionViewDelegateFlowLayout func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { - return CGSizeMake(itemWidth, itemHeight) + return itemSize } func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat { diff --git a/Kiwix/Operations/UpdateWidgetDataSourceOperation.swift b/Kiwix/Operations/UpdateWidgetDataSourceOperation.swift index 8ccd0ecb..b11bb681 100644 --- a/Kiwix/Operations/UpdateWidgetDataSourceOperation.swift +++ b/Kiwix/Operations/UpdateWidgetDataSourceOperation.swift @@ -8,6 +8,7 @@ import CoreData import PSOperations +import NotificationCenter class UpdateWidgetDataSourceOperation: Operation { let context: NSManagedObjectContext @@ -34,7 +35,7 @@ class UpdateWidgetDataSourceOperation: Operation { bookmarks.append(articleData) } defaults?.setObject(bookmarks, forKey: "bookmarks") - + NCWidgetController.widgetController().setHasContent(bookmarks.count > 0, forWidgetWithBundleIdentifier: "self.Kiwix.Bookmarks") finish() } }