Использование CATransform3D

Я пытаюсь сделать поворот на табличном виде, чтобы наклонить стол (чтобы создать эффект ползания трехмерного текста, аналогичного ползанию при открытии звездных войн).

Посмотрев вокруг, я нашел этот вопрос объективным -с CALayer UIView реальная ротация

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

Это код, который я копирую:

float distance = 50;

CATransform3D basicTrans = CATransform3DIdentity;
basicTrans.m34 = 1.0 / -distance;
_tableView.layer.transform = CATransform3DRotate(basicTrans, M_PI_4, 1.0f, 0.0f, 0.0f);

Я помещаю это в мой метод viewDidLoad после создания моего массива строк (которые заполняют tableView)

В настоящее время у меня есть только три других метода в контроллере:

didReceiveMemoryWarning (автоматически добавляется при создании проекта)

tableView: numberOfRowsInSelection (используется для настройки представления таблицы) tableView: cellForRowAtIndexPath (используется для настройки представления таблицы и задания текста ячеек из массива)

Насколько я понимаю, в табличном представлении есть CALayer, и что CATransform3D управляет этим, чтобы получить представление вида в трехмерном пространстве. Если мое понимание верно, то я не понимаю, почему список отображается нормально на экране? Я ценю числа, которые пока не дают желаемого эффекта, но они должны как минимум влиять на отображение tableView на экране.

Также я импортировал QuartzCore и т. Д. И добавил его в связанные рамки


Решение состоит в том, чтобы использовать код, помеченный как СТАРЫЙ ответ в табличном представлении - (UITableViewCell *): cellForRowAtIndexPath: метод после проверки ячейки на нулевое значение.

1 ответ

Решение

Поскольку предложенный ниже подход не сработал, я бы попробовал еще одну вещь - применить преобразование к UITableViewподвиды. На самом деле, UITableView это UIScrollView, так что это просто контейнер для подпредставлений, которые составляют реальное содержимое табличного представления. Я бы попробовал что-то вроде этого:

for (UIView* subview in tableView.subviews) {
  subview.layer.transform = ...;
}

Я никогда не проверял иерархию подпредставлений табличного представления, поэтому не могу сказать, сработает ли это, или вам лучше применить преобразование только к одному из подпредставлений, но я надеюсь, что это может привести вас в правильном направлении.

СТАРЫЙ ОТВЕТ:

Вы можете попробовать установить слой вашего табличного представления sublayerTransform вместо `transform':

Обычно это свойство используется для добавления перспективы и других эффектов просмотра во встроенные слои. Вы добавляете перспективу, устанавливая преобразование подслоя в нужную матрицу проекции. Значением этого свойства по умолчанию является преобразование идентичности.

( источник).

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

Другие вопросы по тегам