UIWebView: отслеживание обновлений экрана (загрязненные области)

#iphone #ios #uiview #uiwebview #calayer

#iPhone #iOS #uiview #uiwebview #calayer

Вопрос:

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

Я думаю, что на самом деле то, что я ищу, — это способ «перехватить» вызовы, которые UIWebView выполняет для setNeedsDisplayInRect. Есть ли способ сделать это? Могу ли я каким-то образом подклассировать базовый объект CALayer UIWebView таким образом, чтобы это позволило мне перехватывать эти вызовы по мере их поступления из UIWebView?

Комментарии:

1. Просто обновление: я попытался использовать категорию Objective C (@implementation CALayer (MyCALayer)) для отслеживания вызовов, идущих из UIWebView в его CALayer. Я получаю вызовы, включая setNeedsDisplayInRect, но, похоже, нет способа обработать вызовы и затем передать их исходному объекту CALayer. Что я упускаю из виду? Наверняка есть способ сделать это?

2. Я также хотел бы знать, возможно ли это!

3. Мне действительно нужен ответ на этот вопрос.

Ответ №1:

Хорошего способа сделать это нет. Вы можете попробовать сделать снимок CALayer UIWebView и сравнить его с предыдущим снимком, но у меня было много проблем с получением надежных снимков UIWebViews.

Ответ №2:

Используйте категорию Objective-C (@implementation CALayer (MyCALayer)) — как вы уже делаете на основе вашего обновления — для отслеживания вызовов, идущих из UIWebView в CALayer.

Затем используйте метод Swizzling, чтобы передать переопределения вашей категории исходному объекту CALayer.

Комментарии:

1. Проблема в том, что вы делаете это для каждого CALayer. Слой UIWebView может быть переопределен с помощью (Class)layerClass . Но фактически изменяемый слой находится внутри частного подвида.