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添加到通用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添加到通用superview中,解决滚动和遮罩问题。我已经这样做了。所有子视图都已正确添加。魁北克