我有一个UIScrollView,其中包含部分绘制在scrollview之外的其他子视图。这些视图在滚动视图上方垂直延伸。是否可以仅允许在滚动视图的顶部之外绘制子视图,而不允许在滚动视图的左侧和右侧之外绘制它们?
正在发生的事情是,当我手动向左和向右滚动时,由于内容大小,子视图正在滚动视图之外绘制。一旦子视图在滚动视图的框架之外滚动,我想剪切子视图。
有任何建议或可能吗?
答案 0 :(得分:11)
我设法通过使用getContentPane().removeAll();
add(comboBoxOptions);
revalidate();
repaint();
的{{1}}属性和CALayer来实现此效果。以下代码段仅剪辑视图顶部和左侧的视图:
layer
请注意,我使用任意数字mask
作为裁剪的最右边和下边界,因此您需要根据您希望其他视图剪辑的距离来调整数字。
答案 1 :(得分:1)
您无法指定要剪辑的各个边,但基本上可以通过在要剪辑的边缘旁边放置一个新的UIView
来伪造它(并因此有效地剪裁它) 。或者,您可以考虑更改视图层次结构的方法,这样您就不必剪辑子视图(可能通过以某种方式调整滚动视图的边界和布局)。
答案 2 :(得分:1)
通常在表或集合视图上执行此操作,例如:
/*
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”系统与“裁剪到边界”系统是不同的。
答案 3 :(得分:0)
以下是我如何在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个点以使子项溢出。 (掩码大于父视图)