Я хочу добавить звуки в свое приложение. Я добавил UIButton с двумя изображениями: soundON и soundOFF. Когда я вызываю настройки звука в приложении в первый раз, они нормально переключаются с каждым изображением. Однако, когда я возвращаюсь к настройкам звука во второй и последующие разы, это похоже на то, что изображения soundOff не исчезают при отображении изображения soundOn. Странно, потому что код такой короткий и простой.
func soundButton() {
sounds = UIButton(frame : CGRect(x: 65, y: 70, width: 40, height:40))
sounds.setImage(UIImage(named : "soundON"), for : .normal)
sounds.setImage(UIImage(named : "soundOFF"), for : .selected)
sounds.showsTouchWhenHighlighted = true
sounds.addTarget(self, action: #selector(soundButtonTapped), for: .touchUpInside)
self.soundView.addSubview(sounds)
}
@objc func soundButtonTapped(_ sender: Any) {
sounds.isSelected.toggle()
isSoundOn.toggle()
}
Я добавил видео, чтобы показать проблему, так как это сэкономит тонну ввода.
http://www.reeflifeapps.com/soundError.mov
Любая помощь приветствуется.
Обновить: У меня была кнопка на UIView, которая была скрыта при запуске головоломки. Когда пользователь нажимал значок «Настройки звука», UIView настроек звука отображался. У меня была кнопка на этой функции, чтобы отобразить настройки звука. Я переместил его в viewDidLoad(), и он исправил это.
Похоже, что soundButton() вызывается каждый раз, когда вы открываете настройки звука, поэтому, когда вы открываете настройки звука в первый раз, он работает нормально, но когда вы снова открываете его, он добавит новую звуковую кнопку в soundView.
Кажется, что ваша звуковая кнопка создается каждый раз, когда вы показываете системный звук.
покажите нам оба метода переключения, а также где вы вызываете soundButton() ?? Вопрос @ anbu хорош.
@ Анбу, вот и все. У меня была кнопка на UIView, которая была скрыта при запуске головоломки. Когда пользователь нажимал значок «Настройки звука», UIView настроек звука отображался. У меня была кнопка на этой функции, чтобы отобразить настройки звука. Я переместил его в viewDidLoad(), и он исправил это. Пожалуйста, укажите это как ответ, и я приму его.
Я предлагаю вам определить логическую переменную, которая сохраняет текущее состояние вашей кнопки. Затем вы должны установить текущее изображение кнопки в соответствии с текущим состоянием переменной.
var isSoundOn = false
@objc func soundButtonTapped(_ sender: Any) {
isSoundOn.toggle()
if isSoundOn {
// your logic when sound on (set button selected image, action etc)
} else {
// logic when sound off (set button not selected image, action etc)
}
}
Если вы все еще хотите использовать soundButton.isSelected
в качестве логической переменной, определите нет изображения для разных состояний в soundButton.setImage(yourImage, for: .selected)
и soundButton.setImage(yourImage, for: .normal)
и определите их следующим образом:
soundButton.setImage(soundButton.isSelected ? soundOnImage : soundOffImage, for: .normal)
Можно использовать один из этих двух подходов, описанных выше.
Обновлено:
Как заявил Ллойд Кайзер, isSoundOn = !isSoundOn
обновлено как isSoundOn.toggle()
В swift 4.2 isSoundOn = !isSoundOn можно заменить на isSoundOn.toggle()
Предустановка изображений (один раз) для .selected
и .normal
и изменение их с помощью isSelected
— довольно стандартная практика.
Спасибо всем. Я пробовал оба вышеперечисленных с тем же результатом. Кнопка загружается в viewDidLoad(). Изображения по-прежнему переключаются, но накладываются друг на друга, а не заменяют друг друга. Вот что так странно. Swift 4.2, может быть, мне нужно удалить изображение перед отображением второго?
Я знаю, что это хорошо известная практика, однако я предложил заменить текущее изображение кнопки, поскольку @DavidSanford говорит, что оно накладывает изображение, а не заменяет его. Вероятно, у вас есть другая проблема, связанная с кодом, который вы не отобразили здесь, потому что я пробовал и не вижу такой же проблемы с кодом выше.
где ты это назвал
soundButton()