我正在设置设置页面(在SettingsView类中),用户可以在其中为背景视差效果设置“开” /“关”。所选内容保存在UserDefaults().string(forKey: "parallaxStatus")
中。在ViewController类的viewWillAppear
中,我检查了parallaxStatus
。如果视差效果的状态为“开”,则显示该效果。如果状态为“关”,则什么也不会发生。
当parallaxStatus
从«On»变为«Off»时出现问题。在这种情况下,在重新加载View之前,视差效果仍然显示。但是,如果parallaxStatus从«Off»更改为«On»,则该函数将在不重新加载View的情况下正常运行。
下面是viewWillAppear
函数的代码。感谢您的帮助或提示。
override func viewWillAppear(_ animated: Bool) {
let parallaxStatus = UserDefaults().string(forKey: "parallaxStatus")
if parallaxStatus == "On" {
let min = CGFloat(-40)
let max = CGFloat(40)
let xMotion = UIInterpolatingMotionEffect(keyPath: "layer.transform.translation.x", type: .tiltAlongHorizontalAxis)
xMotion.minimumRelativeValue = min
xMotion.maximumRelativeValue = max
let yMotion = UIInterpolatingMotionEffect(keyPath: "layer.transform.translation.y", type: .tiltAlongVerticalAxis)
yMotion.minimumRelativeValue = min
yMotion.maximumRelativeValue = max
let motionEffectGroup = UIMotionEffectGroup()
motionEffectGroup.motionEffects = [xMotion,yMotion]
bgImage.addMotionEffect(motionEffectGroup) } else { }
}
答案 0 :(得分:1)
1-您应该在userDefaults中使用bool值
constexpr int i = 10;
constexpr int j = 5;
std::string str{ i * j, 'f' }; // ok as long as the values are constexpr and don't cause any narrowing conversion this value: 10 * 5 = 50 which is a well defined signed-char value.
int i = 10;
int j = 5;
std::string str{ i * j, 'f' }; // error. the values of i and j are not constant thus it may overflow a signed char causing narrowing conversion thus the compiler is wise enough to prevent this initialization.
2-{{1}}在您拒绝显示/弹出的vc时被调用,因此在您的情况下,您可以使用settingsView而不是vc来验证它是否被其他KVO或任何事件驱动的通知程序调用
3-如果状态为on并更改为off,请验证是否删除了vc仍然存在的运动效果(不要取消分配,请在其他检查中进行操作)
UserDefaults.standard.bool(forKey: "parallaxStatusOn") // default is false