изменить весь вид контроллера фона в Swift

Я использовал paramiko связку (nice) и pxssh (также приятно). Я бы тоже порекомендовал. Они работают несколько иначе, но имеют относительно большое перекрытие в использовании.

-3
задан rmaddy 18 January 2019 в 17:44
поделиться

2 ответа

У вас есть несколько вариантов ... какой вариант лучше всего зависит от ваших потребностей на самом деле.

Как упомянул Вудсток в своем ответе, вы можете использовать NotificationCentre, я не буду это повторять.

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

каждый раз, когда вы меняете фон ... установите значение

 UserDefaults.standard.set(imageName, forKey "backgroundImageName")

Затем в каждом контроллере вида просто загрузите значение в viewWillAppear

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated: animated)
    if let backgroundImageName = UserDefaults.standard.string(forKey: "backgroundImageName") {
        self.backgroundImageView.image = UIImage(named: backgroundImageName)
    }
}

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

Преимуществом этого метода является то, что он «запоминает» настройку между пользователем, перезапускающим приложение.

Пример того, как вы можете уменьшить повторение кода, используя подклассы:

class WallpaperedViewController: UIViewController {

    lazy private var imageView: UIImageView = {
        let imageView = UIImageView()
        view.addSubview(imageView)
        view.sendSubview(toBack: imageView)
        return imageView
    }()

    private func setWallPaperImage() {
        let imageName = UserDefaults.standard.string(forKey: "backgroundImageName")

        let image = UIImage(named: imageName!)
        imageView.image = image
        //imageView.contentMode = .scaleAspectFill


        imageView.translatesAutoresizingMaskIntoConstraints = false
        imageView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        imageView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        imageView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        self.setWallPaperImage()
    }
}

Затем для каждого ViewController, у которого есть фоновые изображения, просто расширьте этот класс:

class SomeViewController: WallpaperedViewController {}
0
ответ дан Scriptable 18 January 2019 в 17:44
поделиться

Вы должны использовать всю систему NotificationCenter.

Проще говоря, вы можете сделать так, чтобы объекты подписывались на значение по умолчанию NotificationCenter и указывали селектор (метод), который будет выполняться при публикации уведомления.

Вы также можете публиковать пользовательские уведомления, которые представляют событие смены обоев.

Я использовал это в приложении, которое построил, чтобы добиться общесистемного перехода в «темный режим».

Для публикации:

@objc func postWallpaperChangeNotification() {
    NotificationCenter.default.post(name: .wallpaperChanged, object: nil)
}

Для подписки:

    NotificationCenter.default.addObserver(self, selector: #selector(someMethodToRunWhenWallpaperChanges(_:)), name: . wallpaperChanged, object: nil)

Также необходимо удалить наблюдателя в deinit() . [+1112]

Это приблизительный код, чтобы дать вам вкус, любые вопросы хму.

0
ответ дан Woodstock 18 January 2019 в 17:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: