Проблема UICollectionView iOS 9 в проекте с поддержкой языков RTL
Кажется, что новая функция автоматического флип-интерфейса на языках RTL вызывает проблемы при использовании UICollectionView
.
Я использовал ограничения типа Trailing/Leading для представления коллекции, и они переключили свои значения, как и должно, на язык RTL.
Проблема состоит в том, что фактически представленные данные относятся к последнему indexPath
в источнике данных коллекции, а UIScrollView.contentOffset.x
первой ячейки - 0.
Правильное поведение было бы одним из следующих:
- Правильно отображает первый
indexPath
и переключает направление прокрутки (справа) - Наилучшая опция
- Не переворачивать пользовательские интерфейсы/ограничения, поэтому данные-данные/
indexPath
/scrollView.contentOffset.x
будут синхронизированы. Опция, которая отключает поддержку RTL.
- Представление ячейки и данных последней indexPath, но фиксация
scrollView.contentOffset.x
для представления последней позиции ячейки.
Я думаю, что Apple может исправить это когда-нибудь в будущем, но между тем нам придется использовать обходные пути, такие как реверсивный массив и/или прокрутку к последнему объекту.
Ответы
Ответ 1
Есть одно общее решение для этой проблемы, которое работает для меня, следуйте ниже, чтобы преодолеть эту проблему,
- Дайте ограничение автомакета в соответствии с вашим требованием, а затем от инспектора атрибутов измените свойство семантического управления представления коллекции на Force справа налево из раскадровки.
![введите описание изображения здесь]()
- Затем откройте раскадровку в качестве исходного кода и найдите "ведущие" атрибуты вашего соответствующего вида коллекции и замените это на "левое" и такое же для "задней", замените "правильной". Теперь вы почти закончили.
![введите описание изображения здесь]()
![введите описание изображения здесь]()
![введите описание изображения здесь]()
- теперь это даст вам результат согласно вашему требованию.
Ответ 2
Я был в подобной ситуации и нашел решение для этого. Если вы используете swift, добавьте следующий фрагмент в свой проект и убедитесь, что bounds.origin всегда следует передним фронтом представления коллекции.
extension UICollectionViewFlowLayout {
open override var flipsHorizontallyInOppositeLayoutDirection: Bool {
return true
}
}
Если вы используете Objective-C, просто подклассифицируйте класс UICollectionViewLayout и переопределите flipsHorizontallyInOppositeLayoutDirection и верните true. Используйте этот подкласс в качестве объекта макета вашего вида коллекции.