From b8ec365a667faf8ec0d48a218e39d2d5a716536e Mon Sep 17 00:00:00 2001 From: "o.bolovintseva" Date: Wed, 16 Jan 2019 16:57:22 +0300 Subject: [PATCH] [ios] improved display of hotel types in search by re-using custom layout --- .../Tags/TagsCollectionViewLayout.swift | 28 ++++++++------ .../Filters/FilterCollectionHolderCell.swift | 1 + .../UI/Search/Filters/FilterTypeCell.swift | 20 ---------- .../MWMSearchHotelsFilterViewController.mm | 7 ++++ .../UI/Storyboard/SearchFilters.storyboard | 37 ++++++++++++------- 5 files changed, 47 insertions(+), 46 deletions(-) diff --git a/iphone/Maps/Bookmarks/Categories/Sharing/Tags/TagsCollectionViewLayout.swift b/iphone/Maps/Bookmarks/Categories/Sharing/Tags/TagsCollectionViewLayout.swift index 91ed2b4f6b..0f59328106 100644 --- a/iphone/Maps/Bookmarks/Categories/Sharing/Tags/TagsCollectionViewLayout.swift +++ b/iphone/Maps/Bookmarks/Categories/Sharing/Tags/TagsCollectionViewLayout.swift @@ -17,10 +17,10 @@ final class TagsCollectionViewLayout: UICollectionViewLayout { return CGSize(width: contentWidth, height: contentHeight) } - var itemHeight: CGFloat = 50 - var itemWidth: CGFloat = 50 - var lineSpacing: CGFloat = 10 - var elementsSpacing: CGFloat = 10 + @IBInspectable var itemHeight: CGFloat = 50 + @IBInspectable var itemWidth: CGFloat = 50 + @IBInspectable var lineSpacing: CGFloat = 10 + @IBInspectable var elementsSpacing: CGFloat = 10 override func prepare() { super.prepare() @@ -35,17 +35,21 @@ final class TagsCollectionViewLayout: UICollectionViewLayout { var lastItemHeight: CGFloat = 0 for section in 0 ..< collectionView.numberOfSections { + xOffset = 0 yOffset += (section == 0) ? 0 : lastItemHeight + 2 * lineSpacing + let indexPath = IndexPath(item: 0, section: section) - let headerSize = headersCache[indexPath]?.size ?? CGSize(width: contentWidth, height: itemHeight) - let frame = CGRect(x: 0, y: yOffset, width: headerSize.width, height: headerSize.height) - let attr = UICollectionViewLayoutAttributes(forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, with: indexPath) - attr.frame = frame - headersCache[indexPath] = attr - - yOffset += headerSize.height + lineSpacing - xOffset = 0 + if collectionView.supplementaryView(forElementKind: UICollectionElementKindSectionHeader, + at: indexPath) != nil { + let headerSize = headersCache[indexPath]?.size ?? CGSize(width: contentWidth, height: itemHeight) + let frame = CGRect(x: 0, y: yOffset, width: headerSize.width, height: headerSize.height) + let attr = UICollectionViewLayoutAttributes(forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, with: indexPath) + attr.frame = frame + headersCache[indexPath] = attr + + yOffset += headerSize.height + lineSpacing + } for item in 0 ..< collectionView.numberOfItems(inSection: section) { let indexPath = IndexPath(item: item, section: section) diff --git a/iphone/Maps/UI/Search/Filters/FilterCollectionHolderCell.swift b/iphone/Maps/UI/Search/Filters/FilterCollectionHolderCell.swift index 30a0789258..1f374a7a88 100644 --- a/iphone/Maps/UI/Search/Filters/FilterCollectionHolderCell.swift +++ b/iphone/Maps/UI/Search/Filters/FilterCollectionHolderCell.swift @@ -25,6 +25,7 @@ final class FilterCollectionHolderCell: MWMTableViewCell { self.tableView = tableView layout() collectionView.allowsMultipleSelection = true + collectionView.contentInset = UIEdgeInsets(top: 0, left: 16, bottom: 0, right: 16) collectionView.reloadData() } diff --git a/iphone/Maps/UI/Search/Filters/FilterTypeCell.swift b/iphone/Maps/UI/Search/Filters/FilterTypeCell.swift index c2238dd89a..8d75e6f7f8 100644 --- a/iphone/Maps/UI/Search/Filters/FilterTypeCell.swift +++ b/iphone/Maps/UI/Search/Filters/FilterTypeCell.swift @@ -1,23 +1,3 @@ -final class TypeCellFlowLayout: UICollectionViewFlowLayout { - - override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { - let attributes = super.layoutAttributesForElements(in: rect) - - var leftMargin = sectionInset.left - var maxY: CGFloat = 0 - attributes?.forEach { layoutAttribute in - if layoutAttribute.frame.origin.y >= maxY { - leftMargin = sectionInset.left - } - - layoutAttribute.frame.origin.x = leftMargin - leftMargin += layoutAttribute.frame.width + minimumInteritemSpacing - maxY = max(layoutAttribute.frame.maxY, maxY) - } - return attributes - } -} - @objc(MWMFilterTypeCell) final class FilterTypeCell: UICollectionViewCell { diff --git a/iphone/Maps/UI/Search/Filters/MWMSearchHotelsFilterViewController.mm b/iphone/Maps/UI/Search/Filters/MWMSearchHotelsFilterViewController.mm index 77be2f1fba..023fab3afb 100644 --- a/iphone/Maps/UI/Search/Filters/MWMSearchHotelsFilterViewController.mm +++ b/iphone/Maps/UI/Search/Filters/MWMSearchHotelsFilterViewController.mm @@ -477,6 +477,13 @@ void configButton(UIButton * button, NSString * primaryText, NSString * secondar auto const type = kTypes[indexPath.row]; auto str = [NSString stringWithFormat:kHotelTypePattern, @(ftypes::IsHotelChecker::GetHotelTypeTag(type))]; cell.tagName.text = L(str); + + //we need to do this because of bug - ios 12 doesnt apply layout to cells until scrolling + if (@available(iOS 12.0, *)) + { + [cell layoutIfNeeded]; + } + auto const selected = m_selectedTypes.find(type) != m_selectedTypes.end(); cell.selected = selected; if (selected) diff --git a/iphone/Maps/UI/Storyboard/SearchFilters.storyboard b/iphone/Maps/UI/Storyboard/SearchFilters.storyboard index f4c6b42cc2..a32a37ee60 100644 --- a/iphone/Maps/UI/Storyboard/SearchFilters.storyboard +++ b/iphone/Maps/UI/Storyboard/SearchFilters.storyboard @@ -1,11 +1,11 @@ - + - + @@ -13,7 +13,7 @@ - + @@ -30,13 +30,13 @@ -