Мое приложение имеет 5 изображения неправильной формы, наложенные друг на друга.Каждое изображение имеет прозрачность по краям, и каждое изображение меньше, чем под ним.Представьте себе безопасный тумблер поверх большого тумблера поверх большего тумблера и т. Д. *
Мне нужно иметь возможность перетаскивать / поворачивать каждое из этих представлений независимо друг от друга и одновременно.
У меня это работает, но при первом пальце, начинающем перетаскивать желаемый вид, наблюдается массивное отставание.
Я сузил его до следующих двух методов:
class BSBTouchableRotatingImageView: UIImageView
{
func alphaFromPoint(point: CGPoint) -> CGFloat
{
var pixel: [UInt8] = [0, 0, 0, 0]
let colorSpace = CGColorSpaceCreateDeviceRGB();
let alphaInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)
let context = CGContext(data: &pixel, width: 1, height: 1, bitsPerComponent: 8, bytesPerRow: 4, space: colorSpace, bitmapInfo: alphaInfo.rawValue)
context!.translateBy(x: -point.x, y: -point.y);
self.layer.render(in: context!)
let floatAlpha = CGFloat(pixel[3])
return floatAlpha
}
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool
{
let result = self.alphaFromPoint(point: point) > 0.0
return result
}
}
Очевидно, что если я закомментирую это, то отставание исчезнет, но из-за того, что iOS не игнорирует прозрачность вUIView, тогда только самый верхний вид может быть затронут.
Есть ли более эффективный и высокопроизводительный способ сделать это?
Мне нужна поддержка iOS 9 +
После запуска профилировщика времени:
![enter image description here](https://i.stack.imgur.com/O2Qup.png)
![enter image description here](https://i.stack.imgur.com/oKS9m.png)
Каждый из этих вертикальных «небоскребов», похожих на блоки интенсивной работы процессора, - это когда любой из UIViews вращается / перетаскивается.Каждый из них выдает примерно 700 - 1000 мс до очистки, и все это в коде, который я загрузил выше.