Развитие iOS: Touchesbegin (с: событие) и Toucheseded (с: событие) блокируйте Issus, когда два пальца касаются uiviewIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Развитие iOS: Touchesbegin (с: событие) и Toucheseded (с: событие) блокируйте Issus, когда два пальца касаются uiview

Сообщение Anonymous »

Проблема < /strong>
Я разрабатываю мультитач-приложение для iOS, которое включает отслеживание нескольких точек сенсорных точек и взаимодействие с относительными прокладками. Функция приложения состоит в том, чтобы ответить на сенсорные события, обновить «статус точки сенсорной точки», выполнить освещение PAD и сделать что -то еще. Я столкнулся с некоторыми проблемами с мультизадажным управлением и обновлением статуса и освещением накладки, и я надеюсь получить некоторую помощь. В частности, когда я помещаю два пальца (два прикосновения) на экран (относитесь к порядку меньше), подушка, соответствующая вашему пальцу, будет освещаться (это то, что я хочу) и делать что -то другое, используя функцию обратного вызова1. Когда я поднимаю свой палец 1 / Touch1 (независимо от того, какой из них), подушка, соответствующая Touch1, должна быть затемненной, но она не затемна, и соответствующая функция обратного вызова (то есть внутри прикосновения (с прикосновением1)) не вызывается. Только когда я перемещаю Touch2 или Lift Touch 2, будет вызван метод прикосновения, соответствующий Touch1, то есть подушка, соответствующая Touch1 Потому что это серьезно влияет на мой опыт приложения. Стоит отметить, что эта проблема возникает только с двумя штрихами и не происходит ни с каким другим количеством штрихов. То есть, когда на моем экране есть много штрихов, и соответствующие прокладки освещаются одновременно, перемещение или подъем любого из штрихов может работать нормально. Эта проблема возникает только тогда, когда на экране существуют два штриха одновременно, и оба касания касаются статическим образом (то есть TouchsMoved не запускается). Если Touch1 или Touch2 перемещается, функция будет работать нормально.
Framework < /strong>
, а структура кода выглядит следующим образом: не все коды < /p>
class MultiPadUIView: UIView {
// ViewModel reference

// Update using combine

// Callback closure,
var functionTouchesBegin (()->Void)
var functionTouchesEnded (()->Void)

// Touch and tracking mapping, Thread Safety
// private let stateQueue = DispatchQueue(label: "com.youapp.touchQueue",
// qos: .userInteractive,
// attributes: .concurrent)

private var touchStatus : [Int]

override init(frame: CGRect) {
super.init(frame: frame)
self.isMultipleTouchEnabled = true
self.backgroundColor = .systemBackground
self.layer.cornerRadius = 12

}

required init?(coder: NSCoder) {
super.init(coder: coder)
self.isMultipleTouchEnabled = true
backgroundColor = .clear
}

// Invalidate the static image cache, and set needs layout
private func invalidateCache() {
cachedImage = nil
resetTouchStates()
setNeedsLayout()
}

private var padFrames: [CGRect] = []

private var cachedImage: UIImage?

private func resetTouchStates() {
}

private func calculatePadFrames() {
}

override func draw(_ rect: CGRect) {
super.draw(rect)

if cachedImage == nil {
cachedImage = generateStaticImage()
}
cachedImage?.draw(in: bounds)

drawDynamicFeedback()
}

private func generateStaticImage() -> UIImage?

}
// draw dynamic content according to touchStatus
private func drawDynamicFeedback()

}

// Called after setNeedDisplay and every touch on screen, called frequently
override func layoutSubviews() {
super.layoutSubviews()
resetTouchStates()
setNeedsDisplay()
}

override func touchesBegan(_ touches: Set, with event: UIEvent?) {
for touch in touches {

// some updataTouchStatus logic,

if let newIndex = newIndex {
//callback function
functionTouchesBegin?(newIndex)
updateTouchState(oldIndex: nil, newIndex: newIndex)
}
}

// mark the view need to be redrawn, and update dynamic content according to touch status
setNeedsDisplay()
}

override func touchesEnded(_ touches: Set, with event: UIEvent?) {
for touch in touches {
// updataTouchesLogic

// callback
if some condition {
// touches ended closure
functionTouchesBegin?(newIndex)
}
}
// mark the view need to be redrawn, and update dynamic content according to touch status
setNeedsDisplay()
}

override func touchesMoved(_ touches: Set, with event: UIEvent?) {
// some logic

// mark the view need to be redrawn, and update dynamic content according to touch status
setNeedsDisplay()
}

override func touchesCancelled(_ touches: Set, with event: UIEvent?) {
touchesEnded(touches, with: event)
resetTouchStates()
}

}
< /code>
После спроса инструмента ИИ сказал, что возможной причиной было блокирование потока. Я использовал защищенную от потока структуру данных в качестве реализации моего статуса прикосновения, но она все еще не сработала должным образом.
и после отладки, когда я все еще оставил Touch2 и поднял Touch1, программа не вводила Toucheseded () совсем. Только после перемещения Touch2 будет запустить Touchesendended (), соответствующий поднятию Touch1.

Подробнее здесь: https://stackoverflow.com/questions/794 ... vent-block
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «IOS»