Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 设置视图控制器的遮罩';s视图属性和该视图';s的tableview子视图会产生两个外观不同的遮罩_Ios_Swift_Uiview_Mask - Fatal编程技术网

Ios 设置视图控制器的遮罩';s视图属性和该视图';s的tableview子视图会产生两个外观不同的遮罩

Ios 设置视图控制器的遮罩';s视图属性和该视图';s的tableview子视图会产生两个外观不同的遮罩,ios,swift,uiview,mask,Ios,Swift,Uiview,Mask,我正在使用以下代码设置视图控制器的视图掩码: view.mask = UIView(frame: view.frame) view.mask?.backgroundColor = UIColor.black.withAlphaComponent(0.25) view.isUserInteractionEnabled = false 然后我还使用以下代码设置上述视图的scrollView子视图的掩码: scrollView.mask = UIView(frame: scrollView.fram

我正在使用以下代码设置视图控制器的视图掩码:

view.mask = UIView(frame: view.frame)
view.mask?.backgroundColor = UIColor.black.withAlphaComponent(0.25)
view.isUserInteractionEnabled = false
然后我还使用以下代码设置上述视图的scrollView子视图的掩码:

scrollView.mask = UIView(frame: scrollView.frame)
scrollView.mask?.backgroundColor = UIColor.black.withAlphaComponent(0.25)
scrollView.isUserInteractionEnabled = false

但面具却完全不同(视图的遮罩比scrollView暗得多。有人知道为什么会发生这种情况吗?

在上面的问题中,您使用的是默认添加的
视图
,但是如果您想在已删除的scrollView中应用遮罩,则需要添加,
添加子视图
方法,如我在下面实现的,请尝试此方法

scrollview.mask = UIView(frame: scrollview.frame)
scrollview.mask?.backgroundColor = UIColor.black.withAlphaComponent(0.25)
scrollview.isUserInteractionEnabled = false
scrollview.addSubview(scrollview.mask!)

在上面的问题中,您使用的是默认添加的
视图
,但如果您想在已删除的scrollView中应用掩码,则需要添加
添加子视图
方法,如我在下面实现的,请尝试此方法

scrollview.mask = UIView(frame: scrollview.frame)
scrollview.mask?.backgroundColor = UIColor.black.withAlphaComponent(0.25)
scrollview.isUserInteractionEnabled = false
scrollview.addSubview(scrollview.mask!)

以下是几点观察:

  • 在设置遮罩的
    时,不希望使用视图的
    。请改用

    视图的遮罩应放置在视图的坐标系内,
    bounds
    是,而
    frame
    不是。
    frame
    是在superview的坐标系内定义的。因此,您需要:

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
    
        view.mask = UIView(frame: view.bounds)
        view.mask?.backgroundColor = UIColor.black.withAlphaComponent(0.25)
    }        
    
    如果视图的原点恰好位于
    0,0
    ,您可能不会注意到使用
    frame
    bounds
    之间的区别,但前者是不正确的,如果视图不在
    0,0
    ,则会导致问题

  • 注意,我将其设置为,如果有什么触发视图的大小发生变化,掩码将相应地更新。您可能也在这样做,但我提到它只是为了清楚。如果您碰巧在
    UIView
    子类(而不是
    UIViewController
    子类)中执行此类操作,你应该改为在家里做这件事

  • 滚动视图的
    遮罩
    与滚动视图一起滚动。因此,如果该遮罩的高度是滚动视图的
    边界的高度
    ,则只要滚动,滚动视图的遮罩就会向上滚动,遮罩的
    框架
    之外的任何内容都将不可见

    因此,您可以将掩码的
    帧的
    大小
    设置为滚动视图的
    内容大小
    。或者我个人会将掩码添加到滚动视图的superview,而不是滚动视图本身)(这样掩码就不会滚动)。但是将滚动视图的掩码设置为滚动视图的
    边界的大小
    /
    帧的大小
    ,而不是其
    内容大小
    ,将无法达到您的要求

  • 您的问题不清楚,但这两个同级/相邻视图是一个还是另一个的子视图?如果是后者,则可能会有问题。如果设置掩码(alpha低于1)对于视图,该遮罩也应用于其所有子视图。因此,如果具有0.25 alpha遮罩的视图具有具有自己的0.25 alpha遮罩的子视图,则实际上该子视图将以0.0625 alpha进行渲染

  • 但是这里有一个文本视图和带标签的滚动视图,两者都是25%的alpha,没有一个是另一个的子视图,并且工作正常:


    话虽如此,我还是建议将alpha添加到通用superview中,解决滚动和遮罩问题。

  • 在设置遮罩的
    时,不希望使用视图的
    。请改用

    视图的遮罩应放置在视图的坐标系内,
    bounds
    是,而
    frame
    不是。
    frame
    是在superview的坐标系内定义的。因此,您需要:

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
    
        view.mask = UIView(frame: view.bounds)
        view.mask?.backgroundColor = UIColor.black.withAlphaComponent(0.25)
    }        
    
    如果视图的原点恰好位于
    0,0
    ,您可能不会注意到使用
    frame
    bounds
    之间的区别,但前者是不正确的,如果视图不在
    0,0
    ,则会导致问题

  • 注意,我将其设置为,如果有什么触发视图的大小发生变化,掩码将相应地更新。您可能也在这样做,但我提到它只是为了清楚。如果您碰巧在
    UIView
    子类(而不是
    UIViewController
    子类)中执行此类操作,你应该改为在家里做这件事

  • 滚动视图的
    遮罩
    与滚动视图一起滚动。因此,如果该遮罩的高度是滚动视图的
    边界的高度
    ,则只要滚动,滚动视图的遮罩就会向上滚动,遮罩的
    框架
    之外的任何内容都将不可见

    因此,您可以将掩码的
    帧的
    大小设置为滚动视图的
    contentSize
    。或者我个人会将掩码添加到滚动视图的superview,而不是滚动视图本身(这样掩码就不会滚动)。但是,将滚动视图的掩码设置为滚动视图的
    边界的大小
    /
    帧的大小
    ,而不是其
    内容大小
    ,将无法达到您的要求

  • 您的问题并不清楚,但这两个视图是兄弟视图/相邻视图还是一个视图是另一个视图的子视图?如果是后者,那就有问题了。如果将遮罩(alpha低于1)设置为视图,则该遮罩也将应用于其所有子视图。因此,如果具有0.25 alpha遮罩的视图具有具有自己的0.25 alpha遮罩的子视图,则实际上该子视图将以0.0625 alpha进行渲染

  • 但是这里有一个文本视图和带标签的滚动视图,两者都是25%的alpha,没有一个是另一个的子视图,并且工作正常:


    话虽如此,我还是建议将alpha添加到通用superview中,解决滚动和遮罩问题。

    我已经这样做了。所有子视图都已正确添加。魁北克