it-swarm.com.ru

Выравнивание справа налево на UICollectionView

это довольно простой вопрос, но я не смог найти однозначного ответа на него на SO (если я его пропустил, пожалуйста, исправьте меня). 

По сути, мой вопрос:Можно ли выровнять содержимое строки UICollectionView справа налево, а не слева направо?

В моем исследовании я видел ответы, предлагающие подклассы UICollectionViewFlowLayout, но я не смог найти пример, где он был создан для выравнивания по правому краю.

Моя цель состоит в том, чтобы настроить 2 представления коллекции следующим образом:

Example

Любая помощь очень ценится!

43
rebello95

Вы можете получить аналогичный результат, выполнив преобразование в представлении коллекции и перевернув его содержимое:

Сначала при создании UICollectionView я выполнил горизонтальный переворот:

[collectionView_ setTransform:CGAffineTransformMakeScale(-1, 1)];

Затем создайте подкласс UICollectionViewCell и сделайте то же горизонтальное отражение для его contentView:

[self.contentView setTransform:CGAffineTransformMakeScale(-1, 1)];
76
LK__

Без каких-либо Xtransform для представления коллекции, просто принудительно RTL:

YourCollectionView.semanticContentAttribute = UISemanticContentAttribute.forceRightToLeft
68
Tawfik Bouabid

В дополнение к ответу Тауфика:

Вы также можете установить свойство Semantic в UICollectionView через Interface Builder:

 Storyboard

Подробнее об этой собственности: в этом вопросе

17
medvedNick

Начиная с iOS 9, Collection Views поддерживают RTL в соответствии с этим WWDC video . Поэтому больше нет необходимости создавать макет потока RTL (если вы уже не используете пользовательский макет). 

Выберите: Изменить схему ...> Параметры> Выполнить> Язык приложения> Псевдязык справа налево

 enter image description here

Когда вы создаете симулятор, текст будет выровнен по правому краю, а представление вашей коллекции будет упорядочено справа налево.

 enter image description here

Хотя есть проблема. Когда contentOffset.x == 0, позиция прокрутки Представления коллекции находится на краю Left (неправильно) вместо края Right (правильно). Смотрите эту статью стека для деталей.

Один из обходных путей - просто прокрутить элемент First к .Left (есть ошибка - .Left на самом деле находится на краю Right или Leading):

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

В моем тестовом проекте мой Collection View был вложен в ячейку Table View, поэтому у меня не было доступа к viewDidAppear(). Поэтому вместо этого я подключился к 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)
    }
}

Чтобы увидеть это в действии, посмотрите ветку RTL в этом git repo . А для контекста, посмотрите это сообщение в блоге и его комментарии .

 enter image description here

13
Robert Chen

Для тех, кто пытается достичь расположения справа налево UICollectionView в Swift

//in viewDidLoad
    YourCollectionView.transform = CGAffineTransform(scaleX: -1.0, y: 1.0)

//in cellForItemAtIndexPath
    cell.transform = CGAffineTransform(scaleX: -1.0, y: 1.0)
11
Saqib Omer

Для тех, у кого такой же вопрос:

В итоге я использовал библиотеку UICollectionViewRightAlignedLayout , которую рекомендовал @ chinttu-roxen-ramani. Вы можете установить его с помощью кода:

self.collectionView.collectionViewLayout = [[UICollectionViewRightAlignedLayout alloc] init];

или через конструктор интерфейса:

Through interface builder

В итоге я сделал пару изменений в библиотеке, но в целом она прекрасно работает.

6
rebello95

вы можете использовать это с iOS 11

extension UICollectionViewFlowLayout {

open override var flipsHorizontallyInOppositeLayoutDirection: Bool {
    return true
}

}

2
m.alqadi

Решение для Swift 4.2 и iOS 9+ за 2 простых шага

  1. инвертируйте свой collectionView в viewDidLoad () следующим образом:

    myCollectionView.transform = CGAffineTransform (scaleX: -1, y: 1)

  2. верните обратно свою ячейку (потому что все вещи перевернуты) в cellForItemAt так:

    cell.transform = CGAffineTransform (scaleX: -1, y: 1)

теперь содержимое находится справа, а прокрутка начинается справа.

0
Mehdico

Изменив и flipsHorizontallyInOppositeLayoutDirection и developmentLayoutDirection, я смог выполнить полноэкранную прокрутку RTL, где первый элемент был полностью направо, а чтобы добраться до последней ячейки, пользователю нужно будет прокрутить влево.

Вот так:

class RTLCollectionViewFlowLayout: UICollectionViewFlowLayout {

    override var flipsHorizontallyInOppositeLayoutDirection: Bool {
        return true
    }

    override var developmentLayoutDirection: UIUserInterfaceLayoutDirection {
        return UIUserInterfaceLayoutDirection.rightToLeft
    }
}
0
cohen72