设置视图控制器的view属性的掩码和该视图的tableview子视图会导致两个看起来不同的掩码

时间:2019-05-21 01:05:06

标签: ios swift uiview mask

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

Dim iSrs As Long
For iSrs = ActiveChart.SeriesCollection.Count To ActiveChart.SeriesCollection.Count - 1 Step -1
    ActiveChart.Legend.LegendEntries(iSrs).Delete
Next
ActiveChart.Legend.LegendEntries(1).Delete

然后我还使用以下代码来设置上方视图的scrollView子视图的蒙版:

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

不过,蒙版显示的完全不同(视图的蒙版比scrollView的蒙版要暗得多。有人知道为什么会发生这种情况吗?

2 个答案:

答案 0 :(得分:0)

在上述问题中,您使用的是默认添加的view,但如果要在已退出的scrollView中应用蒙版,则需要添加addsubview方法,例如我在下面实现的方法,试试这个

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

答案 1 :(得分:0)

一些观察结果:

  1. 设置遮罩的frame时,您不想使用视图的frame。请改用bounds

    视图的遮罩应放置在视图的坐标系中,bounds是,而frame不是。 frame在超级视图的坐标系中定义。所以你想要:

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
    
        view.mask = UIView(frame: view.bounds)
        view.mask?.backgroundColor = UIColor.black.withAlphaComponent(0.25)
    }        
    

    如果您的视图恰好起源于0, 0,则可能不会注意到使用framebounds的区别,但是前者是不正确的,如果出现以下情况,则会导致问题:视图从未出现在0, 0

  2. 请注意,我在viewDidLayoutSubviews中进行了设置,以便在某些情况下触发了视图尺寸的更改时,也会相应地更新蒙版。您可能也正在这样做,但是我提一下是为了清楚。如果您恰巧是在UIView子类(而不是UIViewController子类)中进行此类操作,则可以在layoutSubviews中进行。

  3. 滚动视图的mask与滚动视图一起滚动。因此,如果该蒙版的高度是滚动视图的bounds的高度,则在您滚动时,滚动视图的蒙版就会向上滚动,并且超出蒙版frame的所有内容将根本不可见。 / p>

    因此,您可以将遮罩的size的{​​{1}}设置为滚动视图的frame。或者我个人将蒙版添加到滚动视图的超级视图中,而不是添加到滚动视图本身)(以使蒙版不会滚动)。但是将滚动视图的掩码设置为滚动视图的contentSize / bounds而不是其frame的大小将无法实现您想要的效果。

  4. 您的问题不清楚,但是这两个同级/相邻视图是一个还是另一个子视图?如果是后者,则可能会出现问题。如果为视图设置蒙版(alpha值低于1),则该蒙版也将应用于其所有子视图。因此,如果具有0.25 alpha蒙版的视图的子视图具有自己的0.25 alpha蒙版,则该子视图将有效地以0.0625 alpha呈现。

但是这里是带有标签的文本视图和滚动视图,它们的alpha均为25%,并且一个视图不是另一个的子视图,并且效果很好:

enter image description here

话虽如此,我建议将alpha添加到一个普通的超级视图中,以解决滚动和遮罩遮罩的问题。