Это не ответ на вопрос, как определить приоритет, но я могу решить вашу проблему . Я не думаю, что вам нужно использовать приоритет жестов, если к одному представлению не прикреплено два жеста. В вашем случае у вас есть два представления с их собственным жестом.
Я думаю, что ваша настоящая проблема в том, что ваш внутренний взгляд находится не поверх вашего внешнего вида. Я бы предложил посмотреть на отладчик иерархии представлений. Я создал вид внутри вида и смог определить свои собственные жесты касанием.
Я создал две простые коробки с жестами крана на детской площадке ...
import UIKit
import PlaygroundSupport
class MyViewController : UIViewController {
override func loadView() {
let view = UIView()
view.backgroundColor = .white
let innerView = UIView()
innerView.backgroundColor = UIColor.red
view.addSubview(innerView)
innerView.translatesAutoresizingMaskIntoConstraints = false
innerView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
innerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
innerView.widthAnchor.constraint(equalToConstant: 100).isActive = true
innerView.heightAnchor.constraint(equalToConstant: 100).isActive = true
self.view = view
let outTapGesture = UITapGestureRecognizer(target: self, action: #selector(outterViewTapped))
let innerTapGesture = UITapGestureRecognizer(target: self, action: #selector(innerViewTapped))
view.addGestureRecognizer(outTapGesture)
innerView.addGestureRecognizer(innerTapGesture)
}
@objc func outterViewTapped() {
print("Outter tapped!")
}
@objc func innerViewTapped() {
print("Inner tapped!")
}
}
// Present the view controller in the Live View window
PlaygroundPage.current.liveView = MyViewController()
Попытка сделать все через командную строку, не сохраняя функции в m-файлах может быть сложным и грязным усилием, но здесь является одним способом, которым я придумал...
Первый, сделайте Ваш анонимные функции и поместите их дескрипторы в массив ячеек :
fcn1 = @() ...;
fcn2 = @() ...;
fcn3 = @() ...;
fcnArray = {fcn1 fcn2 fcn3};
... или, если у Вас есть функции, уже определенные (как в m-файлах), помещают указатели на функцию в массив ячеек как так:
fcnArray = {@fcn1 @fcn2 @fcn3};
Затем можно сделать новую анонимную функцию, которая вызывает каждую функцию в массиве с помощью встроенных функций cellfun
и feval
:
foo = @() cellfun(@feval,fcnArray);
, Хотя забавно выглядящий, это работает.
РЕДАКТИРОВАНИЕ: , Если бы функции в fcnArray
потребность, которую назовут с входными параметрами, необходимо было бы сначала удостовериться, что ВСЕ функции в массиве требуют ТОГО ЖЕ количества исходных данных. В этом случае следующий пример показывает, как назвать массив функций с одним входным параметром каждым:
foo = @(x) cellfun(@feval,fcnArray,x);
inArgs = {1 'a' [1 2 3]};
foo(inArgs); %# Passes 1 to fcn1, 'a' to fcn2, and [1 2 3] to fcn3
WORD OF WARNING: документация для [1 116] cellfun
состояния, что порядок , в котором вычисляются выходные элементы, не указывают и нельзя положиться. Это означает, что нет никаких гарантий, который fcn1
оценен прежде fcn2
или fcn3
. Если порядок имеет значение, вышеупомянутое решение не должно использоваться.
Синтаксис анонимной функции в Matlab (как некоторые другие языки) только позволяет отдельное выражение. Кроме того, это имеет другую семантику привязки переменной (переменные, которые не находятся в списке аргументов, имеют их значения лексически связанный в функциональное время создания, вместо связываемых ссылок). Эта простота позволяет MathWorks делать некоторую оптимизацию негласно и избегать большого грязного обзора и возражать пожизненным проблемам при использовании их в сценариях.
при определении этой анонимной функции в функции (не сценарий) можно создать названные внутренние функции. Внутренние функции имеют нормальную лексическую ссылочную привязку и позволяют произвольные числа операторов.
function F = createfcn(a,...)
F = @myfunc;
function b = myfunc(...)
a = a+1;
b = a;
end
end
Иногда можно сойти с рук приемы как предложение gnovice.
Быть осторожным относительно использования оценки... это очень неэффективно (это обходит JIT), и оптимизатор Matlab может запутаться между переменными и функциями от внешнего объема, которые используются в выражении оценки. Также трудно отладить и/или код степени, который использует оценку
Если functionCall1()
и functionCall2()
возврат что-то и те somethings могут быть связаны, то можно сделать это:
>> foo = @() [functionCall1(), functionCall2()]
или
>> foo = @() [functionCall1(); functionCall2()]
побочный эффект А этого состоит в том, что foo()
возвратит конкатенацию любого functionCall1()
и functionCall2()
возврат.
я не знаю, гарантируется ли порядок выполнения functionCall1()
и functionCall2()
.
Возможно, я пропускаю что-то, просто делаю функцию combinationCall, который вызывает обе функции для Вас.