Наконец-то я проверил метод, предложенный @rickster: подключите UIInterpolatingMotionEffect
к моим ключам доступа GLKView/GL, которые изготовленные на заказ и просто извлекающие их. К сожалению, эта идея рояльно терпит неудачу.
Прежде всего, ключи, которые передаются в UIInterpolatingMotionEffect
, должны быть UIView
анимированными свойствами и не могут быть настраиваемыми переменными/свойствами. Учитывая, что большинство людей не хотят, чтобы весь их контекст был параллаксом в одном направлении/интенсивности, этот метод потерпит неудачу.
Во-вторых, вы не можете просто получить значения. Если вы передадите center.x
в качестве ключа, UIInterpolatingMotionEffect
не будет обновлять center.x
, так как изменения считаются «анимациями». Таким образом, у вас есть вы извлекаете мультипликационного center.x
, например [[view.layer presentationLayer] center];
Конечные ноты: Просто создать отдельный UIView
в главном потоке, добавьте его в UIViewController
и систематически извлекать значения из него (также в основном потоке). Я обнаружил, что это самое простое решение.
Кроме того, поскольку мне нужно было получить значения в отдельном потоке, я, как правило, 1 значение позади, так как я отправляю в основной поток для получения текущего значения и в то же время извлекаю последний набор значений (убедитесь, что переменная является потокобезопасной/атомной).
EDIT
Поскольку все возможное, чтобы получить доступ к представительский уровень в главном потоке, но мой метод вызывается для потока, который не является основной, я отправка основной поток, чтобы получить значение и поместить его в атомное свойство. Затем я вернул бы атомную собственность за пределы потока. Это гарантирует, что мой вторичный поток не будет заблокирован основным потоком, и я могу получить нужные мне значения.
Вот код, который я использовал для извлечения значений из потока, который не является основной поток:
@property (atomic) GLKVector2 currentOffset;
@property (atomic, readonly) GLKVector2 offset;
- (GLKVector2)offset
{
dispatch_async(dispatch_get_main_queue(), ^{
CGRect frame = [[self.view.layer presentationLayer] frame];
self.currentOffset = (GLKVector2){-frame.origin.x, -frame.origin.y};
});
return self.currentOffset;
}
Можете ли вы предоставить более подробно в пункте 4, где вы ответить на ваш вопрос? –
@JohnStephen done :) –
Спасибо, это было очень полезно! –