我有一个 UIScrollView,其中包含部分绘制在滚动视图之外的其他子视图。这些视图在滚动视图上方垂直延伸。是否可以只允许子视图绘制在滚动视图的顶部之外,而不允许它们绘制在滚动视图的左右两侧之外?
发生的事情是,当我手动左右滚动时,由于内容大小,子视图被绘制在滚动视图之外。一旦子视图滚动到滚动视图的框架之外,我想剪辑子视图。
有什么建议或者这可能吗?
我有一个 UIScrollView,其中包含部分绘制在滚动视图之外的其他子视图。这些视图在滚动视图上方垂直延伸。是否可以只允许子视图绘制在滚动视图的顶部之外,而不允许它们绘制在滚动视图的左右两侧之外?
发生的事情是,当我手动左右滚动时,由于内容大小,子视图被绘制在滚动视图之外。一旦子视图滚动到滚动视图的框架之外,我想剪辑子视图。
有什么建议或者这可能吗?
我已经设法通过使用layer
'mask
属性和 CALayer 来实现这种效果。以下片段仅剪辑视图顶部和左侧的视图:
let maskLayer = CALayer()
maskLayer.backgroundColor = UIColor.black.cgColor
maskLayer.frame = CGRect(x: 0, y: 0, width: 2000, height: 2000)
aView.layer.mask = maskLayer
请注意,我使用任意数字2000
作为剪辑的最右边和下限,因此您需要根据您希望其他视图剪辑的距离来调整数字。
您无法指定要剪辑的单个边,但您基本上可以通过在UIView
要剪辑的边缘旁边放置一个新边来伪造这一点(并有效地剪辑它)。或者,您可以考虑更改视图层次结构的方法,以便您根本不必剪辑子视图(也许通过以某种方式调整滚动视图的边界和布局)。
通常在表或集合视图上执行此操作,例如:
/*
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”系统与“剪辑到边界”系统不同并且是分开的。
下面是我如何在 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;
父视图或其子视图中未被遮罩中的黑色像素覆盖的任何部分都将被剪裁。
在这个片段中,我们裁剪左右,但在父视图的顶部和下方留下 100 个点以供子视图溢出。(掩码大于父视图)