你能将UIView剪辑子视图限制在视图的某些边吗?

时间:2014-02-09 23:16:51

标签: ios uiview uiscrollview subview cliptobounds

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

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

有任何建议或可能吗?

4 个答案:

答案 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个点以使子项溢出。 (掩码大于父视图)