Невидимая кнопка не реагирует на нажатие - PullRequest
0 голосов
/ 11 марта 2019

Я пытаюсь поместить невидимую кнопку поверх просмотра изображения, потому что просмотр изображения слишком мал, чтобы реагировать на распознавание жестов касания.Я не могу просто сделать изображение больше, потому что это выглядит плохо.Вот код для просмотра изображения для увеличения количества:

private func configureIncreaseQuantityImageView() {
    increaseQuantityImageView.contentMode = .scaleAspectFill
    increaseQuantityImageView.image = UIImage(named: "arr_up")
    //increaseQuantityImageView.isUserInteractionEnabled = true
    //increaseQuantityImageView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleIncreaseQuantityTapped)))
    contentView.addSubview(increaseQuantityImageView)
    increaseQuantityImageView.translatesAutoresizingMaskIntoConstraints = false
    increaseQuantityImageView.centerYAnchor.constraint(equalTo: verticalDivider.centerYAnchor).isActive = true
    increaseQuantityImageView.leftAnchor.constraint(equalTo: verticalDivider.rightAnchor, constant: 12).isActive = true
    increaseQuantityImageView.widthAnchor.constraint(equalToConstant: 12).isActive = true
    increaseQuantityImageView.heightAnchor.constraint(equalToConstant: 8).isActive = true
}

Вот код для невидимой кнопки, которая не реагирует на касание:

private func configureInvisibleIncreaseQuantityButton() {
    invisibleIncreaseQuantityButton.backgroundColor = .clear
    invisibleIncreaseQuantityButton.addTarget(self, action: #selector(handleIncreaseQuantityTapped), for: .touchUpInside)
    contentView.addSubview(invisibleIncreaseQuantityButton)
    invisibleIncreaseQuantityButton.translatesAutoresizingMaskIntoConstraints = false
    invisibleIncreaseQuantityButton.centerYAnchor.constraint(equalTo: verticalDivider.centerYAnchor).isActive = true
    invisibleIncreaseQuantityButton.leftAnchor.constraint(equalTo: verticalDivider.rightAnchor).isActive = true
    invisibleIncreaseQuantityButton.widthAnchor.constraint(equalToConstant: 35).isActive = true
    invisibleIncreaseQuantityButton.heightAnchor.constraint(equalToConstant: 40).isActive = true
}

Вот функция, которая не 'Тебя призывают прикоснуться к невидимой кнопке.Я сделал что-то очень похожее для кнопки уменьшения количества, поэтому не нужно показывать этот код.

@objc private func handleIncreaseQuantityTapped() {
    self.quantity += 1
    quantityValueLabel.text = "\(self.quantity)"
    self.menuItem?.quantity = self.quantity
    guard let item = self.menuItem else { return }
    delegate?.updateMenuItem(item)
}

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Свифт 4,2

Вы можете добавить UITapGestureRecognizer в суперпредставление imageView и установить диапазон, содержащий местоположение imageView.


Например:

let superviewOfImageView = UIView()
let imageView = UIImageView()

func setupTapGesture() {
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(didTap(_:)))
    superviewOfImageView.addGestureRecognizer(tapGesture)
}

@objc func didTap(_ gesture: UITapGestureRecognizer) {
    // user's finger tap at superview's location.
    let point = gesture.location(in: superviewOfImageView)

    // set the range you want.
    let width = superviewOfImageView.frame.width/4 
    let height = superviewOfImageView.frame.height/4
    let boundaryOfImageView = CGRect(x: 0, y: 0, width: width, height: height)

    // if in the range you set, do what ever you want.
    if boundaryOfImageView.contains(point) {
        // do something here.
    }
}

Удачи, мой друг!

0 голосов
/ 12 марта 2019

Вообще говоря, вам не нужна кнопка для этого.Вы можете сделать то же самое, просто используя 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, который я только что сделал, это отличный инструмент:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...