Aligning right to left on UICollectionView

前端 未结 13 641
悲哀的现实
悲哀的现实 2020-12-02 08:31

this is a pretty straightforward question, but I haven\'t been able to find a definitive answer to it on SO (if I missed it, please correct me).

Basically, my quest

13条回答
  •  春和景丽
    2020-12-02 09:26

    As of iOS 9, Collection Views support RTL according to this WWDC video. So it's no longer necessary to create an RTL flow layout (unless you're already using a custom layout).

    Select: Edit Scheme... > Options > Run > Application Language > Right to Left Pseudolanguage

    When you build to Simulator, text will be right-aligned, and your Collection View will be ordered from Right to Left.

    There's a problem though. When contentOffset.x == 0, the Collection View scroll position is at the Left edge (wrong) instead of the Right edge (correct). See this stack article for details.

    One workaround is to simply scroll the First item to the .Left (There's a gotcha -- .Left is actually on the Right, or Leading edge):

    override func viewDidAppear(animated: Bool) {
        if collectionView?.numberOfItemsInSection(0) > 0  {
            let indexPath = NSIndexPath(forItem: 0, inSection: 0)
            collectionView?.scrollToItemAtIndexPath(indexPath, atScrollPosition: .Left, animated: false)
        }
    }
    

    In my test project, my Collection View was nested inside a Table View Cell, so I didn't have access to viewDidAppear(). So instead, I ended up hooking into drawRect():

    class CategoryRow : UITableViewCell {
        @IBOutlet weak var collectionView: UICollectionView!
    
        override func drawRect(rect: CGRect) {
            super.drawRect(rect)
            scrollToBeginning()
        }
    
        override func prepareForReuse() {
            scrollToBeginning()
        }
    
        func scrollToBeginning() {
            guard collectionView.numberOfItems(inSection: 0) > 0 else { return }
            let indexPath = IndexPath(item: 0, section: 0)
            collectionView.scrollToItem(at: indexPath, at: .left, animated: false)
        }
    }
    

    To see this in action, check out the RTL branch on this git repo. And for context, see this blog post and its comments.

提交回复
热议问题