Панорамирование UIView только из 1 подвида

У меня есть UIView (alertView), который служит настраиваемым предупреждением. Внутри этого UIView у меня есть несколько взаимодействий. Я хотел бы, чтобы только верхняя часть этого пользовательского оповещения (alertHeaderView) могла быть панорамирована для перемещения alertView, сохраняя при этом функциональность содержимого alertView.

У меня сейчас это полурабочее. В раскадровке я добавил распознаватель жестов панорамирования ко всему alertView. Моя функциональность панорамирования работает отлично, но не позволяет всем взаимодействиям происходить в представлении. Это проблема.

@IBAction func panAlert(_ sender: UIPanGestureRecognizer) {
    // ... All my pan code.
}

Я создал выход для заголовка:

@IBOutlet weak var alertHeaderView: UIView!

Есть ли способ панорамировать весь alertView, ТОЛЬКО от касаний из alertHeaderView?


person Joe    schedule 05.02.2018    source источник
comment
применить жест панорамирования только к alertHeaderview   -  person Jaydeep Vyas    schedule 05.02.2018
comment
Это заставляет его панорамировать только заголовок. не весь вид.   -  person Joe    schedule 05.02.2018
comment
в этом случае вы можете поддерживать проверку, получая местоположение касания внутри UIview, т.е. AlertView, если это представление касания находится в требуемом представлении дескриптора границ с жестом панорамирования, иначе нет перевода, короче говоря, добавьте панорамирование ко всему представлению предупреждений, когда пользователь коснется. Место, а затем сделать перевод   -  person iOS Geek    schedule 05.02.2018
comment
Я опубликовал ответ, который обязательно поможет вам получить требуемый результат, спасибо.   -  person iOS Geek    schedule 05.02.2018


Ответы (1)


вот мой проверенный код - он ограничивает перемещение представления из определенного набора мест

import UIKit

class AlertWithPan: UIViewController
{
    @IBOutlet weak var alertView: UIView!

    override func viewDidLoad()
    {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        self.alertView.isHidden = true
        self.addPanGesture()
    }

    func addPanGesture()
    {
        let gesture : UIPanGestureRecognizer = UIPanGestureRecognizer(target: self, action:#selector(AlertWithPan.handlePanGesture(panGesture:)))
        self.alertView.addGestureRecognizer(gesture)
    }



    @objc func handlePanGesture(panGesture: UIPanGestureRecognizer)
    {

        ///Get my Location
        let touchPosition = panGesture.location(in: self.alertView)
        print("currentTouch: \(touchPosition.y), ViewOrigin_Y: \(String(describing: panGesture.view?.frame.origin.y))")

        //Let us limit the frame Movement on specific location 
        //In your case you had initialised a header View supposingly it is having height 32 
        //So we will set TouchPosition not to move Ahead of that View
        //I am using here touch Location in AlertView 
        //Setting it to limit upto `self.alertView.frame.size.height*0.2`


        //self.alertView.frame.size.height*0.2 - This refers to Height of your Header View 
        //if a view having total height of Hundred then If I write self.alertView.frame.size.height*0.2
        //This means just 20 percent of height - 20 out of hundred 
        //we had added pan in AlertView , I.e So we need to set a proper height in which Pan will be allowed to set translation 
        //self.alertView.frame.size.height*0.2 - using this I made the view to move only in case if touch location is with in the header size I.e 20 
        // if you had provided static height of header 
        //Then Can get this by using like pan gesture.origin.y + header view height 
        // So check will be  touchPosition.y > Total of both
        if touchPosition.y > self.alertView.frame.size.height*0.2 {
            print("High")
        }
        else{
            print("Low")
            ///Get the changes
            let translation = panGesture.translation(in: self.view)

            ///Move view to required Position
            panGesture.view!.center = CGPoint(x: panGesture.view!.center.x, y: panGesture.view!.center.y + translation.y)
            panGesture.setTranslation(CGPoint.zero, in: self.view)
        }



    }


    @IBAction func showMyAlertView(_ sender: Any)
    {
        self.alertView.isHidden = false
    }
}

моя раскадровка:

введите здесь описание изображения

Рабочее видео:

https://drive.google.com/open?id=1ZZuqxc34BUEZQ7WGFJiA2lU6ydIwqEjn

person iOS Geek    schedule 05.02.2018
comment
Спасибо за помощь! Сейчас я просматриваю ваш код, и мне нужна небольшая помощь: if touchPosition.y › self.alertView.frame.size.height*0.2 {. Я не уверен, что делает эта линия. Я просто хочу иметь возможность обнаруживать touchPosition в alertHeaderView - person Joe; 05.02.2018
comment
Сотрите это, я понял :) Я изменил эту строку, чтобы область заголовка соответствовала высоте alertHeaderView, а не 0,2% от всего alertView. Спасибо за помощь!! - person Joe; 05.02.2018
comment
Я отредактировал свой ответ с четким описанием, во всяком случае, добро пожаловать, рад помочь - person iOS Geek; 05.02.2018
comment
Спасибо за отредактированное описание. Это помогло. Однако нашел небольшой баг. Если пользователь коснется области содержимого (область под заголовком), а затем проведет пальцем вверх в область заголовка, представление подпрыгнет вверх, потому что палец вошел в область заголовка. Есть ли способ предотвратить это? - person Joe; 05.02.2018
comment
Да, я заметил, что теперь мне нужно проверить возможное решение для этого. Я сообщу вам, если найду некоторые - person iOS Geek; 05.02.2018
comment
Есть ли способ использовать условную проверку вашего местоположения с помощью UIGestureRecognizerState.began? Затем вы бы проверили начальное положение касания, поэтому быстрое пролистывание не приведет к нежелательному поведению? - person Joe; 05.02.2018
comment
Проблема в основном возникает, поскольку предположим, что w начал проводить пальцем в неактивной области панели AlertView. Вид активируется. Дело в том, что если пользователь не поднимает палец вверх и не достигает активной области, проводя пальцем, он перемещается вверх. У вас есть идеи, что мы сможет сделать ? Я пытался использовать некоторые жесты в нем, но не сработало - person iOS Geek; 06.02.2018
comment
Я на самом деле решил это довольно легко. Как прокомментировал Джейдип выше, я просто добавил распознаватель в заголовок. Затем я просто перемещаюсь по центру alertView в функции handlePanGesture! Я думаю, что мы слишком много думали об этом :) Теперь отлично работает - person Joe; 06.02.2018
comment
Точно, Мы слишком много думали. Я тоже сделал это как ссылку для меня - person iOS Geek; 06.02.2018