Элементы мультимедиа в ячейках коллекции JSQMessageViewController не отображаются в IOS 14

#ios #objective-c #swift #jsqmessagesviewcontroller #ios14

#iOS #objective-c #swift #jsqmessagesviewcontroller #ios14

Вопрос:

Я использую JSQMessageViewController и сталкиваюсь с проблемой (только в ios14), что я не могу видеть элементы мультимедиа, такие как изображения, видео и аудио, на устройстве, хотя эти представления генерируют иерархию представлений отладки. Смотрите прикрепленное изображение ниже:-

скриншот иерархии представления отладки:

введите описание изображения здесь

вот описание UIImage внутри ячейки представления коллекции: <UIImageView: 0x7fe7d6d95b30; frame = (20 8; 177 131); clipsToBounds = ДА; непрозрачный = НЕТ; авторазмер = RM BM; Пользовательское взаимодействие разрешено = НЕТ; layer = <CALayer: 0x600001ce4ec0>>

вот скриншот прилагаемого экрана:

введите описание изображения здесь

Вы можете видеть, что представление создало пространство для изображения, но оно не отображается!

Кто-нибудь сталкивается с этой проблемой? как я могу решить эту проблему. Эта проблема возникает в iOS 14, она отлично работает в iOS 13.

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

1. JSQMessageViewController не обновлялся более 4 лет и больше не поддерживается. Может быть, вы можете попробовать MessageKit вместо этого: github.com/MessageKit/MessageKit

Ответ №1:

Вам необходимо перезаписать в JSQMessagesMediaViewBubbleImageMasker.m
метод — (void)jsq_maskView:(UIView *) просмотр с изображением: (UIImage *) изображение и строка изменения:

 view.layer.mask = imageViewMask.layer;
  

чтобы быть

 view.maskView = imageViewMask;
  

Я предлагаю вам использовать category для этого. Для меня это было решением.

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

1. Спасибо, @Vladimir Это решение сработало для меня, но я хочу подтвердить, нужно ли нам добавлять проверку #available(iOS 14.0, *) перед добавлением этой строки?

Ответ №2:

Я хотел бы предложить изменить следующим образом вместе с ответом Владимира для обратной совместимости:

 if (@available(iOS 14.0, *)) {
    view.maskView = imageViewMask;
} else {
    view.layer.mask = imageViewMask.layer;
}