4

有谁知道如何从本机 iOS7 天气应用程序中重现类似的效果?

基本上,状态栏继承了下面视图的背景,但内容没有显示出来。此外,在状态栏的 20 像素高度之后绘制一条 1 像素的线,仅当某些内容被覆盖时。

在此处输入图像描述

4

3 回答 3

4

最好的办法是通过视图的clipSubview。您将内容放入视图中并对左/右/底部和高度进行约束。您检查的滚动视图上的高度是单元格的负位置,此时您开始更改内容(剪辑)视图的高度以获得所需的效果。

这是一个真正的应用程序,您可以从 www.fancyinteractive.com 下载并查看。此功能将在下次更新时提供。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
NSArray *visibleCells = [convertorsTableView visibleCells];

if (visibleCells.count) {
    for (CVConverterTableViewCell *cell in visibleCells) {
        CGFloat positionYInView = [convertorsTableView convertRect:cell.frame toView:self.view].origin.y;

        [self clipLayoutConstraint:cell.clipHeightLayoutConstraint withPosition:positionYInView defaultHeight:cell.frameHeight];

        [cell.converterLabel layoutIfNeeded];
        [cell.iconImageView layoutIfNeeded];
    }
}

[self checkStatusBarSeperator:scrollView.contentOffset.y];
}

- (void)clipLayoutConstraint:(NSLayoutConstraint *)constraint withPosition:(CGFloat)position defaultHeight:(CGFloat)defaultHeight {
if (position < 0) {
    constraint.constant = (defaultHeight - -position - 20 > 10) ? defaultHeight - -position - 20 : 10;
} else
    constraint.constant = defaultHeight;
}

起始页

滚动第一项

滚动第二个项目

于 2015-01-15T20:32:21.100 回答
1

您可以通过为表格视图的图层设置遮罩来完成此操作。但是,您将无法在单元格内渲染动画,但您可以自己在表格视图后面执行这些动画,并使用表格视图的滚动视图委托方法跟踪它们的移动。

以下是有关CALayer面具的一些信息:http: //evandavis.me/blog/2013/2/13/getting-creative-with-calayer-masks

于 2013-09-27T03:41:35.417 回答
0

斯威夫特 5:

override func scrollViewDidScroll(_ scrollView: UIScrollView) {
    guard let visibleCells = tableView.visibleCells as? [TableViewCell] else { return }

    let defaultClipHeight: CGFloat = 24
    let statusBarHeight: CGFloat = UIApplication.statusBarHeight
    
    if !visibleCells.isEmpty {
        for cell in visibleCells {
            let topSpace = cell.frame.size.height - defaultClipHeight - cell.clipBottomConstraint.constant
            let cellOffsetY = tableView.contentOffset.y - cell.frame.origin.y + statusBarHeight
            
            if cellOffsetY > topSpace {
                let clipOffsetY = cellOffsetY - topSpace
                let clipHeight = defaultClipHeight - clipOffsetY
                
                cell.clipHeightConstraint.constant = max(clipHeight, 0)
            } else {
                cell.clipHeightConstraint.constant = defaultClipHeight
            }
        }
    }
}

起始页: 起始页

滚动第一项: 滚动第一项

滚动第二项: 滚动第二项

于 2021-09-22T11:58:15.273 回答