Проблема < /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
Развитие iOS: Touchesbegin (с: событие) и Toucheseded (с: событие) блокируйте Issus, когда два пальца касаются uiview ⇐ IOS
Программируем под IOS
1739751403
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.
Подробнее здесь: [url]https://stackoverflow.com/questions/79444153/ios-development-touchesbeginwith-event-and-touchesendedwith-event-block[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия