удалить подвид, который используется с imageView

У меня есть изображение карты в моем ImageView, и мне нужна красная точка для текущего местоположения пользователя, поэтому я использую эти 3 строки кода для создания красной точки над моим ImageView

let overlay: UIView = UIView(frame: CGRect(x: xcorIn * 0.822, y:  ycorIn * 1.03, width: 5, height: 5))

overlay.backgroundColor = UIColor(red: 255/255, green: 0/255, blue: 0/255, alpha: 1)

imageView.addSubview(overlay)

все, что я хочу, это после 2 секунд появления красной точки, она должна исчезнуть

поэтому я пробую это

 DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1), execute: {
            self.imageView.delete(overlay)

})

функция задержки кажется работает, но

self.imageView.delete(overlay)

верни мне эту ошибку

Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «-[UIImageView delete:]: нераспознанный селектор отправлен экземпляру 0x7f8bef712df0»


person Joey    schedule 26.09.2017    source источник


Ответы (3)


Вам нужно удалить overlay из superView. Вы можете сделать это:

DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1), execute: {
    overlay.removeFromSuperview()
})

Или, если у вас нет глобального наложения, вы можете сделать это. Добавьте тег к оверлею, а затем сделайте следующее:

let overlay: UIView = UIView(frame: CGRect(x: 100, y:  100, width: 5, height: 5))
overlay.tag = 0
overlay.backgroundColor = UIColor(red: 255/255, green: 0/255, blue: 0/255, alpha: 1)
imageView.addSubview(overlay)

DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1), execute: {
    for subView in self.imageView.subviews {
        if subView.tag == 0 {
            subView.removeFromSuperview()
        }
    }
})
person Rashwan L    schedule 26.09.2017
comment
@Joey, np рад помочь. - person Rashwan L; 26.09.2017

Вы можете удалить точку, используя ее ссылку и метод "removeFromSuperview()"

let overlay: UIView = UIView(frame: CGRect(x: xcorIn * 0.822, y:  ycorIn * 1.03, width: 5, height: 5))
        overlay.backgroundColor = UIColor(red: 255/255, green: 0/255, blue: 0/255, alpha: 1)
        imageView.addSubview(overlay)

        DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1), execute: {
            overlay.removeFromSuperview()
        })
person Bharath    schedule 26.09.2017

Вы получаете эту ошибку, потому что в imageView нет метода delete, но есть метод с именем removeFromSuperview.

Вы собираетесь удалить наложение из SuperView

DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1), execute: {
   overlay.removeFromSuperview()
})

Or:

self.overlay.hidden = true

Или попробуйте следующее, если ваша ссылка на него была сильной ссылкой, убедитесь, что nil эта сильная ссылка:

overlay= nil 

Или анимируйте без использования dispatchQueue:

UIView.animate(withDuration: 0.5, delay: 0.3, options: [.repeat, .curveEaseOut, .autoreverse], animations: {
    self.overlay.alpha = 0
}, completion: nil)
person casillas    schedule 26.09.2017