Я хочу применить CIFilter к элементу пользовательского интерфейса. Я попытался применить его к слою views через член .filters. Однако фильтр не будет применен.Применение CIFilters на элементах пользовательского интерфейса
ответ
Вот такой подход: используйте UIGraphicsGetImageFromCurrentImageContext
для создания UIImage
, примените к нему фильтр и наложите изображение, содержащее отфильтрованное изображение поверх вашего исходного компонента.
Вот способ сделать это с размытием (taken from my blog):
Getting размытого представления UIView довольно прост: мне нужно, чтобы начать контекст изображения, используйте метод renderInContext слоя вида по для визуализации в контекст, а затем получить UIImage из контекста:
UIGraphicsBeginImageContextWithOptions(CGSize(width: frame.width, height: frame.height), false, 1)
layer.renderInContext(UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext();
После того, как у меня есть изображение заселена, это довольно стандартный рабочий процесс, чтобы применить гауссово размывание к нему:
guard let blur = CIFilter(name: "CIGaussianBlur") else
{
return
}
blur.setValue(CIImage(image: image), forKey: kCIInputImageKey)
blur.setValue(blurRadius, forKey: kCIInputRadiusKey)
let ciContext = CIContext(options: nil)
let result = blur.valueForKey(kCIOutputImageKey) as! CIImage!
let boundingRect = CGRect(x: -blurRadius * 4,
y: -blurRadius * 4,
width: frame.width + (blurRadius * 8),
height: frame.height + (blurRadius * 8))
let cgImage = ciContext.createCGImage(result, fromRect: boundingRect)
let filteredImage = UIImage(CGImage: cgImage)
Размытое изображение будет больше, чем его входное изображение, поэтому мне нужно указать размер, который мне нужен, в createCGImage
.
Следующий шаг должен добавить UIImageView
в мой взгляд и скрыть все остальные виды. Я подклассы UIImageView
к BlurOverlay
так, что, когда дело доходит до его удаления, я могу быть уверен, что я не вынимая существующий UIImageView
:
let blurOverlay = BlurOverlay()
blurOverlay.frame = boundingRect
blurOverlay.image = filteredImage
subviews.forEach{ $0.hidden = true }
addSubview(blurOverlay)
Когда дело доходит до ДЭ-размывания, я хочу, чтобы обеспечить последний подтаблицы это одна из моих BlurOverlay
удалить его и UNHIDE существующих просмотров:
func unBlur()
{
if let blurOverlay = subviews.last as? BlurOverlay
{
blurOverlay.removeFromSuperview()
subviews.forEach{ $0.hidden = false }
}
}
Наконец, чтобы увидеть, если в UIView
в настоящее время размыты, мне просто нужно увидеть, если его последняя подтаблицы является BlurOverlay
:
var isBlurred: Bool
{
return subviews.last is BlurOverlay
}
- 1. Применение фильтров на элементах управления
- 2. Применение изображения к панели пользовательского интерфейса Unity
- 3. ExtJS - Применение шаблонов пользовательского интерфейса JQuery
- 4. WPF, что случилось с объектом диспетчера на элементах пользовательского интерфейса?
- 5. Android - Потеря области на элементах пользовательского интерфейса после onDestroy()
- 6. Применение .on на динамически добавленных элементах
- 7. Применение стилей на элементах ul li jquery
- 8. Значения CIFilters
- 9. Применение пользовательского цвета на HighCharts?
- 10. Обнаружение событий пользовательского интерфейса iOS в программно созданных элементах управления
- 11. window.innerHeight, согласованный между элементами Chrome, созданными в элементах пользовательского интерфейса.
- 12. АОП и применение безопасности к элементам пользовательского интерфейса
- 13. Модификаторы доступа на элементах интерфейса в C#
- 14. Применение внутреннего интерфейса класса
- 15. CAShapeLayer с CIFilters
- 16. Показать диалог выполнения на Android без блокировки кликов на других элементах пользовательского интерфейса
- 17. Добавление пользовательского интерфейса на холст
- 18. Изменение пользовательского интерфейса на ABPeoplePicker
- 19. Кнопки на зависании пользовательского интерфейса
- 20. iOS CIFilters, которые на самом деле работают?
- 21. Применение классов CSS в элементах OPTGROUP
- 22. вкладки пользовательского интерфейса пользовательского JQuery
- 23. IE 8 Ошибка при создании виджета пользовательского интерфейса на клонированных элементах
- 24. Зацикливание на аналогичных элементах пользовательского интерфейса - возможно, получив переменную от ее имени?
- 25. Почему некоторые операции пользовательского интерфейса jQuery не увенчались успехом на бестелесных элементах DOM?
- 26. Unity3D - Получить сенсорные входы, но не на элементы пользовательского интерфейса
- 27. Несколько CIFilters в одном CIImage?
- 28. CIFilters вызвало приложение к сбою
- 29. Дизайн пользовательского интерфейса в WPF - создание нестандартного пользовательского интерфейса
- 30. Применение пользовательского стиля к блесны
Транк вам за ваш ответ. Это именно то, что я хочу сделать. Мне нужно применить фильтр (преобразование перспективы) в MKMapView. Что бы вы порекомендовали сделать тогда. Взаимодействие с пользователем не обязательно должно быть. Я думаю о том, чтобы никогда не добавлять MapView в представление и просто получать изображение, как вы сказали. Однако я буду поворачивать MapView программно, поэтому он должен иметь определенную частоту кадров во время движения. Как я могу получить больше изображений при перемещении вида? – Lenny1357
Если вы хотите повернуть изображение в 3D, почему бы не использовать изображение в качестве диффузного содержимого для материала SceneKit, примененного к плоскости? Если вы хотите анимировать точки перспективного преобразования, посмотрите на «CADisplayLink» (но я думаю, что вы получите более интересные результаты с помощью SceneKit :)). –
Я поворачиваю MapView вокруг географической координаты. И поворот вокруг координаты должен быть показан с применением фильтра. В этом случае простой образ не будет делать трюк. Что вы предложите сделать для того, чтобы показать поворот, который MapView управляет сам по себе с помощью примененного CIFilter? Это похоже на использование CIFilter на видео, но в моем случае это анимация из самого MapView, которую я хочу показать. Мне нужно будет. как PixelBuffer. К сожалению, я думаю, что невозможно установить его для MapView. – Lenny1357