【问题标题】:How to modify view.alphaValue at runtime and take effect如何在运行时修改view.alphaValue并生效
【发布时间】:2019-07-25 06:05:47
【问题描述】:

我在运行时修改了 alphaValue 但没有任何效果,这是什么问题。如何在运行时修改 alphaValue ?

我想在运行时调整view的alphaValue

Xcode 10.2.1 斯威夫特 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
        }

    }

【问题讨论】:

  • 这是view.alpha 而不是view.alphaValue。您的问题不清楚,您可以添加更多细节吗?问题和预期结果是什么?
  • 测试你的代码一切正常,不是 alphaValue 而是 alpha
  • alphpValue 其实是 xcode 10.2.1 swift 4.2 以上
  • @baileymiller2017 好的,将其视为alphaValue,但有什么问题?设置后视图不透明吗?添加您的视图的屏幕截图并在您的代码中包含预期的结果。
  • btnclick1动作无效,窗口看起来还是一样的alpha值透明,你可以在xcode试试

标签: swift xcode cocoa


【解决方案1】:

NSViewControllerviewWillAppear 方法中,您的视图窗口可能是nil。您可以通过打印print(view.window) 进行检查。所以你需要得到你的窗口的正确实例。见下面的方法:

func validWindow() -> NSWindow? {
    var window = NSApplication.shared.mainWindow
    if (window == nil) {
        window = NSApplication.shared.windows.first
    }
    return 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 仍然 ``` class ViewController: NSViewController { func validWindow() -> NSWindow? { var window = NSApplication.shared.mainWindow if (window == nil) { window = NSApplication.shared.windows.first } return window } @IBAction func btnclick1(_ sender: Any) { guard let window = self.validWindow()否则 { 返回 } window.alphaValue = 0.9 } ... } ```
  • 我在 viewDidLoad: 方法中编写了这段代码,它将 alpha 值更改为 0.5(半透明)。你能指望什么?试试 0.4 还是 0.5 ?
  • 我只是想通过点击按钮来改变使窗口变得透明或不透明的 alphaValue。
  • @baileymiller2017 随附的屏幕截图不是您要的?
  • 不,我也做过。现在,我想让它可调,可以在控制下一点一点地改变。你为什么不明白我的意思。对不起。
【解决方案2】:

alphaValuealpha 的 Objective-C 版本。在 viewController 视图上应用alpha 会使其略微透明,并且可能会显示其下方的 viewController(如果有的话)。如果没有 在它下面的视图控制器,它将倾向于较暗的背景,因为默认背景是黑色。

【讨论】:

  • 这不是真的。这也是Objective-C 中的alpha
  • 请不要将视图称为视图控制器。
猜你喜欢
  • 2012-09-20
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
相关资源
最近更新 更多