Вообще говоря, вам не нужна кнопка для этого.Вы можете сделать то же самое, просто используя UIView, который наложен на объект.
Но есть несколько соображений, когда вы делаете это программно, главным образом, что вы фактически не видите визуально, где находится объект пользовательского интерфейса, потому что все это обрабатывается в коде вместо раскадровки.
Мои предложения: 1) Взаимодействие с пользователем может быть не разрешено в вашем представлении
Функция .addSubview()
может размещать объект, к которому вы хотите прикоснуться , под объектом, который он должен покрывать.
Вот изящный маленький фрагмент, который я часто использую, чтобы быстро найти подпредставление:
Эта функция возвращает все подпредставления, содержащиеся в предоставленном представлении, в виде массива.
private func getSubviewsOf<T : UIView>(view:UIView) -> [T] {
var subviews = [T]()
for subview in view.subviews {
subviews += getSubviewsOf(view: subview) as [T]
if let subview = subview as? T {
subviews.append(subview)
}
}
return subviews
}
Вы можете использовать это так:
// First, let's get an ID on the object you are trying to find
`invisibleDecreaseQuantityButton.restorationIdentifier = "targetView"`
// Then, also set a restoration ID on the view that this targetView is supposed to be on top of
increaseQuantityImageView.restorationIdentifier = "coveredView"
// Now, get all of the subviews of the main view
let subviews = self.getSubViewsOf(view: self.view)
var targetViewIndex = 0
var coveredViewIndex = 0
// Figure out which view is the correct one
for (index, view) in subviews.enumerated() {
// When we find the target view
if view.restorationIdentifier == "targetView" {
// Let's print it so we know where it resides
print("targetView's index: \(index)")
targetViewIndex = index
}
if view.restorationIdentifier == "coveredView"{
// print this one too
print("coveredView's index: \(index)")
coveredViewIndex = index
}
}
Эта часть действительно предназначена для того, чтобы помочь вам отладить программно.Если вы хотите использовать в приложении более визуальный метод отладки, я настоятельно рекомендую FLEX .С помощью этой инфраструктуры вы можете визуально коснуться каждого элемента и получить его имя переменной, а также визуально увидеть график с размещением всей иерархии представлений в контроллере представлений.
Помните, что в иерархии представлений представление с более низким индексом в массиве подпредставлений означает, что оно ближе к вершине представления.Итак:
if targetIndex > coveredViewIndex {
// push the coveredView behind the targetView
self.view.insertSubview(targetView, at: coveredViewIndex)
}
Подробнее об иерархиях здесь в Документация Apple
Lmk, если я могу помочь вам в дальнейшей отладке.Вот небольшой скриншот FLEX, который я только что сделал, это отличный инструмент: