如何在运行时修改view.alphaValue并生效
How to modify view.alphaValue at runtime and take effect
我在运行时修改了 alphaValue 但没有任何效果,这是什么问题。如何在运行时修改 alphaValue?
我想在运行时调整view的alphaValue
Xcode 10.2.1 Swift 4.2
//
// ViewController.swift
// macosappalphaValuetest
//
// Created by miller on 2019/7/25.
// Copyright © 2019 miller. All rights reserved.
//
import Cocoa
class ViewController: NSViewController {
@IBAction func btnclick1(_ sender: Any) {
self.view.alphaValue = 0.8
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
override func viewWillAppear() {
super.viewWillAppear()
view.window?.isOpaque = false
view.window?.backgroundColor = NSColor(red: 0.5, green: 0.5, blue: 0.5, alpha: 0.5)
self.view.alphaValue = 0.4
}
}
alphaValue
是 alpha
的 Objective-C 版本。在 viewController 视图上应用 alpha
会使它稍微透明,并且可能会显示其下方的 viewController(如果有的话)。如果没有
它下面的视图控制器,它将倾向于更暗的背景,因为默认背景是黑色的。
在 NSViewController
的 viewWillAppear
方法中,您的视图 window 可能是 nil
。您可以通过打印 print(view.window)
来检查它。因此,您需要获取 window 的正确实例。请参阅以下方法:
func validWindow() -> NSWindow? {
var window = NSApplication.shared.mainWindow
if (window == nil) {
window = NSApplication.shared.windows.first
}
return window
}
只需编写以下代码即可使您的 window 透明:
guard let window = self.validWindow() else { return }
window.alphaValue = 0.5
对我来说效果很好。
输出:
递归增加和减少 alpha 值:
func decreaseAlpha(_ window: NSWindow) {
let alpha = window.alphaValue - 0.1
if alpha < 0.0 {
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {
self.increaseAlpha(window)
}
return
}
window.alphaValue = alpha
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {
self.decreaseAlpha(window)
}
}
func increaseAlpha(_ window: NSWindow) {
let alpha = window.alphaValue + 0.1
if alpha > 1.0 {
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {
self.decreaseAlpha(window)
}
return
}
window.alphaValue = alpha
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {
self.increaseAlpha(window)
}
}
并在 viewDidLoad:
方法中写入:
guard let window = self.validWindow() else { return }
decreaseAlpha(window)
输出:
我在运行时修改了 alphaValue 但没有任何效果,这是什么问题。如何在运行时修改 alphaValue?
我想在运行时调整view的alphaValue
Xcode 10.2.1 Swift 4.2
//
// ViewController.swift
// macosappalphaValuetest
//
// Created by miller on 2019/7/25.
// Copyright © 2019 miller. All rights reserved.
//
import Cocoa
class ViewController: NSViewController {
@IBAction func btnclick1(_ sender: Any) {
self.view.alphaValue = 0.8
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override var representedObject: Any? {
didSet {
// Update the view, if already loaded.
}
}
override func viewWillAppear() {
super.viewWillAppear()
view.window?.isOpaque = false
view.window?.backgroundColor = NSColor(red: 0.5, green: 0.5, blue: 0.5, alpha: 0.5)
self.view.alphaValue = 0.4
}
}
alphaValue
是 alpha
的 Objective-C 版本。在 viewController 视图上应用 alpha
会使它稍微透明,并且可能会显示其下方的 viewController(如果有的话)。如果没有
它下面的视图控制器,它将倾向于更暗的背景,因为默认背景是黑色的。
在 NSViewController
的 viewWillAppear
方法中,您的视图 window 可能是 nil
。您可以通过打印 print(view.window)
来检查它。因此,您需要获取 window 的正确实例。请参阅以下方法:
func validWindow() -> NSWindow? {
var window = NSApplication.shared.mainWindow
if (window == nil) {
window = NSApplication.shared.windows.first
}
return window
}
只需编写以下代码即可使您的 window 透明:
guard let window = self.validWindow() else { return }
window.alphaValue = 0.5
对我来说效果很好。
输出:
递归增加和减少 alpha 值:
func decreaseAlpha(_ window: NSWindow) {
let alpha = window.alphaValue - 0.1
if alpha < 0.0 {
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {
self.increaseAlpha(window)
}
return
}
window.alphaValue = alpha
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {
self.decreaseAlpha(window)
}
}
func increaseAlpha(_ window: NSWindow) {
let alpha = window.alphaValue + 0.1
if alpha > 1.0 {
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {
self.decreaseAlpha(window)
}
return
}
window.alphaValue = alpha
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {
self.increaseAlpha(window)
}
}
并在 viewDidLoad:
方法中写入:
guard let window = self.validWindow() else { return }
decreaseAlpha(window)
输出: