Ios 能否将UIView剪辑子视图限制在视图的某些侧面?

Ios 能否将UIView剪辑子视图限制在视图的某些侧面?,ios,uiview,uiscrollview,subview,cliptobounds,Ios,Uiview,Uiscrollview,Subview,Cliptobounds,我有一个UIScrollView,其中包含在scrollview外部部分绘制的其他子视图。这些视图垂直延伸到滚动视图上方。是否可以只允许在scrollview顶部之外绘制子视图,而不允许在scrollview的左侧和右侧之外绘制子视图 发生的情况是,当我手动向左和向右滚动时,由于内容大小的原因,子视图被绘制在scrollview之外。一旦子视图在scrollview的框架外滚动,我想剪辑子视图 有什么建议或可能吗?您不能指定要剪裁的各个边,但基本上可以通过在要剪裁的边旁边放置一个新的UIView

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

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


有什么建议或可能吗?

您不能指定要剪裁的各个边,但基本上可以通过在要剪裁的边旁边放置一个新的
UIView
来假装这一点(从而有效地剪裁它)。或者,您可以考虑更改视图层次结构的方法,这样您就不必剪裁子视图(可能通过某种方式调整滚动视图的边界和布局)。

我已经通过使用
遮罩
属性和CALayer实现了这一效果。以下代码段仅剪辑视图顶部和左侧的视图:

let maskLayer = CALayer()
maskLayer.backgroundColor = UIColor.blackColor().CGColor
maskLayer.frame = CGRectMake(0, 0, 2000, 2000) 

aView.layer.mask = maskLayer

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

以下是我如何在Objective-C中实现Max Chukimia的优秀解决方案:

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;
父视图或其子视图中未被遮罩中的黑色像素覆盖的任何部分都将被剪裁

在这个片段中,我们从左到右剪辑,但在父视图的顶部和下方保留100个点,以便子视图溢出。(遮罩比父视图大)

将剪辑限制在视图的某些侧面: 在表或集合视图上执行此操作很常见,例如:

/*
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”系统与“剪裁到边界”系统不同,并且是独立的。

我确实在边缘旁边有一个UIView。该视图和scrollview都有.7 alpha级别,因此很遗憾,这一技巧不会奏效。如果要剪裁上下,而不是左右,帧会是什么?@RoNiT您需要将要剪裁的矩形的边缘与要添加遮罩的视图的边缘保持一致,所以请尝试
cRectmake(-2000,020000,aView.bounds.height)
只需在此处使用方便的“.inset”命令即可修改当前帧