Перетащите UILabel из точки A в точку B - PullRequest
1 голос
/ 18 сентября 2009

Как я могу перетащить UILabel из точки A в точку B в приложении iPhone?

Ответы [ 2 ]

3 голосов
/ 18 сентября 2009

По сути, вам необходимо создать функциональность самостоятельно. Вы можете сделать это, прослушав прикосновения в суперпредставлении, которое включает в себя всю перетаскиваемую область. Метод hitTest:withEvent: может сказать вам, находится ли точка касания на ярлыке, который нужно перетащить.

Оттуда вы можете переопределить метод touchesMoved:withEvent:, чтобы обновить положение UILabel, чтобы оно совпало с пальцем. Обновление позиции метки автоматически перерисовает ее для вас.

Вот соответствующий вопрос для iphone drag / drop .

Как только вы включите перетаскивание, я бы также порекомендовал обратить внимание на местоположение в UILabel, где было сделано первое касание, и обработать изменение положения таким образом, чтобы палец всегда находился в этой точке внутри UILabel. Более простая в написании, но хуже выглядящая версия - просто переместить, скажем, верхний левый угол метки туда, где находится палец, но это может привести к тому, что метка будет прыгать, когда она впервые начинает перетаскивать. *

Это может звучать пугающе, но на самом деле все не так плохо - всего несколько строк кода. Если у вас нет представлений, которые могут перекрываться. Это еще несколько строк, в зависимости от того, как вы хотите справиться с этим.

0 голосов
/ 07 апреля 2016
// MARK: - Touch Functions

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {

    guard let location = touches.first?.preciseLocationInView(quoteView) else { return }

    if quoteView.pointInside(location, withEvent: event) {
        locationInView = location.y
        isInButton = true
    } else {
        isInButton = false
    }
}

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {

    if isInButton {

        guard let totalYMovement = touches.first?.preciseLocationInView(self.view).y,
        locationInView = self.locationInView else { return }

        var yMovement = totalYMovement - quoteViewLocation
        if locationInView >= (self.quoteView.frame.height / 2) {
            // Works!
            yMovement = yMovement - (locationInView - (self.quoteView.frame.height / 2))
        } else {
            yMovement = yMovement + ((self.quoteView.frame.height / 2) - locationInView)
        }

        self.quoteView.transform.ty = yMovement
    }
}

Я использовал приведенный выше код для перевода вида вдоль оси y. Переменная quoteViewLocation представляет собой таблицу CGPoint, которая возвращает

self.view.frame.height / 2

locationInView - это дополнительная CGPoint, которая устанавливается каждый раз, когда производится касание внутри вида, который необходимо преобразовать.

Вы можете разместить кнопку в любом месте вашего представления, используя мой код, просто убедитесь, что ваша переменная quoteViewLocation (как бы вы ее ни называли) возвращает CGPoint.y по горизонтали, разделяя представление. Эта точка должна быть соответствующей точкой суперпредставления. Под этим я подразумеваю, что если у вас есть дочерний вид с высотой 40 точек и супер-вид с высотой 40 точек, а дочерний вид имеет центрированный привкус в середине супер-вида, вы можете подумать, что CGPoint правильно возврат 20. Нет! Хотя это правильный центр Y дочернего вида, центр суперпредставления равен 200. Верните CGPoint суперпредставления.

Вы должны сделать это, чтобы преобразование было плавным.

Если вы хотите переместить вид вдоль оси x, это та же идея.

Если я что-то пропустил или промахнулся на меня. Здесь тоже пытаюсь учиться.

Спасибо

...