您可以将 UIView Clip Subviews 限制在视图的某些方面吗?

Posted

技术标签:

【中文标题】您可以将 UIView Clip Subviews 限制在视图的某些方面吗?【英文标题】:Can you limit UIView Clip Subviews to certain sides of a view? 【发布时间】:2014-02-09 23:16:50 【问题描述】:

我有一个 UIScrollView,其中包含部分绘制在滚动视图之外的其他子视图。这些视图在滚动视图上方垂直延伸。是否可以只允许子视图绘制在滚动视图的顶部之外,而不允许它们绘制在滚动视图的左右两侧之外?

发生的情况是,当我手动左右滚动时,由于内容大小,子视图被绘制在滚动视图之外。一旦子视图滚动到滚动视图的框架之外,我想剪辑子视图。

有什么建议吗?或者这可能吗?

【问题讨论】:

【参考方案1】:

我已经通过使用layermask 属性和一个CALayer 来实现这个效果。以下 sn-p 仅从视图的顶部和左侧剪辑视图:

let maskLayer = CALayer()
maskLayer.backgroundColor = UIColor.black.cgColor
maskLayer.frame = CGRect(x: 0, y: 0, width: 2000, height: 2000)
aView.layer.mask = maskLayer

请注意,我使用任意数字 2000 作为剪辑的最右边和下限,因此您需要根据希望其他视图剪辑的距离来调整数字。

【讨论】:

如果你想从上到下剪辑,而不是从左到右剪辑,框架会是什么? @RoNiT 您需要将要剪辑的矩形的边缘与要添加蒙版的视图边缘保持一致,因此请尝试CGRectMake(-2000, 0, 2000, aView.bounds.height) 这里使用方便的“.inset”命令,修改当前帧【参考方案2】:

您无法指定要剪切的单个边,但您基本上可以通过在要剪切的边缘旁边放置一个新的UIView 来伪造这一点(从而有效地剪切它)。或者,您可以考虑更改视图层次结构的方法,以便您根本不必剪辑子视图(也许通过以某种方式调整滚动视图的边界和布局)。

【讨论】:

我确实在边缘有一个 UIView。该视图和滚动视图都具有 0.7 的 alpha 级别,因此不幸的是,这个技巧不起作用。【参考方案3】:

将剪辑限制在视图的某些侧面:

在表格或集合视图上执行此操作很常见,例如:

/*
This is a UICollectionView, which clips normally on the left and right,
but allows some extra space horizontally.
A typical example is you need to clip the scrolling items but you
still need to allow shadows.
*/

import Foundation
import UIKit

class CustomClipCollectionView: UICollectionView 
    
    private lazy var extraSpaceOnBaseButStillClipSidesNormally: CALayer = 
        let l = CALayer()
        l.backgroundColor = UIColor.black.cgColor
        return l
    ()
    
    override func layoutSubviews() 
        extraSpaceOnBaseButStillClipSidesNormally.frame = bounds.insetBy(
                          dx: 0, dy: -10)
        layer.mask = extraSpaceOnBaseButStillClipSidesNormally
        super.layoutSubviews()
    

注意!你关闭正常的“剪辑到边界”功能,当使用这个。用于剪辑的“.mask”系统与“剪辑到边界”系统不同。

【讨论】:

【参考方案4】:

以下是我在 Objective-C 中实现 Max Chuquimia 的出色解决方案的方法:

CALayer* maskLayer = [CALayer layer];
maskLayer.backgroundColor = [UIColor blackColor].CGColor;
maskLayer.frame = CGRectMake(0,-100,
                            parentView.frame.size.width, parentView.frame.size.height + 100);
parentView.layer.mask = maskLayer;

父视图或其子视图中被遮罩中的黑色像素覆盖的任何部分都将被剪裁。

在这个 sn-p 中,我们裁剪左右,但在父视图的顶部和下方留下 100 个点以供子视图溢出。 (掩码比父视图大)

【讨论】:

以上是关于您可以将 UIView Clip Subviews 限制在视图的某些方面吗?的主要内容,如果未能解决你的问题,请参考以下文章

UIView 常见属性

ios/objective c:迭代 UIView.subviews 仅显示部分视图

ios uiview 自动展开尺寸

UIView属性的讲解

self.view.subviews 不显示按钮

ios 取出subviews中指定subview