Добавление искажения с проекцией точки схода в CAlayer

Я хотел бы преобразовать UIView таким образом, чтобы добавить к нему перспективу (с двумя точками схода) (см. Ниже).

UIView с применением преобразования

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

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

У кого-нибудь есть идеи, как подойти к этой проблеме?

1 ответ

Решение

Кажется, я нашел способ обойти / решить проблему:

Используя преобразования CATransform3D, можно аппроксимировать точки обзора, разделяя вид на две части (две независимые UITableViews). Им должен управлять UIViewController (не UITableViewController, предоставляемый кодом x), который реализует необходимые протоколы.

Затем в методе viewDidLayoutSubviews: используйте следующий код для преобразования двух табличных представлений.

- (void) viewDidLayoutSubviews {

     CATransform3D rotationAndPerspectiveTransform = CATransform3DIdentity;
    // left View
    // vantage point
    rotationAndPerspectiveTransform.m34 = 1.0 / -150.0;
    // Z-rotation of 90°
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 90.0 * M_PI/180.0, 0, 0,1);
    // X-rotation of 25°
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, -25.0 * M_PI/180.0, 1, 0,0);
    // left view
    [self.view viewWithTag:1].layer.transform = rotationAndPerspectiveTransform;


    //right view
    rotationAndPerspectiveTransform = CATransform3DIdentity;
    rotationAndPerspectiveTransform.m34 = 1.0 / -150;
    // Z-rotation of 90°
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 90.0 * M_PI / 180.0, 0, 0,1);
    // X-rotation of 30°
    rotationAndPerspectiveTransform = CATransform3DRotate(rotationAndPerspectiveTransform, 25.0 * M_PI / 180.0, 1, 0,0);
    // right view
    [self.view viewWithTag:2].layer.transform = rotationAndPerspectiveTransform;
}

После преобразования две таблицы могут быть сдвинуты так, чтобы они аккуратно совмещались. Единственное оставшееся задание - соединить прокрутку одного телевизора с другим. Я еще не понял этого.

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