美文网首页iOS Developer程序员
IOS中当UITableView的SectionHead为透明时

IOS中当UITableView的SectionHead为透明时

作者: 半白乀 | 来源:发表于2017-05-08 02:42 被阅读0次

关于这个话题我想解决的问题以及会达到什么效果,看图说话。

问题 结果
  • 在介绍思路之前必须了解「mask」这个属性,了解了mask,做起来就相当简单了!

Mask 英文解释是蒙板/面罩,平时我们称为蒙层. 在苹果官方文档里如下图,意思是Mask是一个可选的Layer,它可以是根据透明度来掩盖Layer的内容.

mask Property

Layer的透明度决定了Layer内容是否可以显示,非透明的内容和背景可以显示,透明的则无法显示.

  • 思路

<small>我们只需要将cell.layer.mask的frame设置为cell在期望的可视范围存在的多少就可以了。

什么是期望的可视范围?一张图说明。
</small>

期望的可视范围
  • 代码

    // 剪除在透明背景下的cell,即只设置可视范围的cell.layer.mask的frame
    - (void)clipOutSideCellWhenUnderTransparencySectionSetMaskFrame:(CGRect)frame {
          CALayer *maskLayer = [CALayer layer];
          maskLayer.backgroundColor = [UIColor whiteColor].CGColor;
          maskLayer.frame = frame;
          self.layer.mask = maskLayer;
      }
    
    // 使用  
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    
        [_tableView.visibleCells enumerateObjectsUsingBlock:^(__kindof UITableViewCell * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
      
            // cell和section覆盖的高度 = 需要剪去的高度 20是contentInset, 100是sectionHeight,再减去cell的y
            CGFloat hideCellHeight = scrollView.contentOffset.y + 20 + 100 - obj.frame.origin.y;
      
            CGRect maksFrame = obj.bounds;
      
            if (hideCellHeight > 0 && hideCellHeight <= obj.frame.size.height) {
                maksFrame =  CGRectMake(0, hideCellHeight, obj.frame.size.width, obj.frame.size.height - hideCellHeight);
              } else if (hideCellHeight > obj.frame.size.height) {
                maksFrame = CGRectZero;
             }
            [obj clipOutSideCellWhenUnderTransparencySectionSetMaskFrame:maksFrame];   
         }];
     }
    

附件
<small>

参考资料
<small>

相关文章

网友评论

    本文标题:IOS中当UITableView的SectionHead为透明时

    本文链接:https://www.haomeiwen.com/subject/eduptxtx.html