2

在自定义 tableview 单元格中,我正在绘制一个带有阴影的简单矩形,如下所示:

photoBorder = [[[UIView alloc] initWithFrame:CGRectMake(4, 4, self.frame.size.width-8, 190)] autorelease];
photoBorder.autoresizingMask = UIViewAutoresizingFlexibleWidth;
photoBorder.backgroundColor = [UIColor whiteColor];
photoBorder.layer.masksToBounds = NO;
photoBorder.layer.shadowOffset = CGSizeMake(0, 1);
photoBorder.layer.shadowRadius = 4;
photoBorder.layer.shadowOpacity = 1.0;
photoBorder.layer.shadowColor = [UIColor darkGrayColor].CGColor;
photoBorder.layer.shouldRasterize = YES;
photoBorder.layer.shadowPath = [UIBezierPath bezierPathWithRect:photoBorder.bounds].CGPath; // this line seems to be causing the problem

当视图首次加载时,这可以正常工作。但是,当您旋转设备时,阴影保持不变。我真的很想把它延伸到“photoBorder”的新宽度。

我可以通过删除 shadowPath 来使其工作,但 tableview 会受到明显的性能影响。

任何人都有任何关于在 UIView 上制作阴影的技巧,可以拉伸,而不会损失性能?

4

3 回答 3

6

在搜索了几个小时并没有找到任何东西后,我发布了这个。然后几分钟后找到了答案。

对我来说,简单的解决方案似乎只是将 shadowPath 移动到 layoutSubviews 中。

- (void)layoutSubviews{
    photoBorder.layer.shadowPath = [UIBezierPath bezierPathWithRect:photoBorder.bounds].CGPath;
}
于 2012-11-13T19:09:34.010 回答
3

您需要创建 UIView 的子类,以便您可以在layoutSubviews()方法中获得新的边界。

注意:如果您尝试在拥有子视图的 ViewController 中添加此代码,则边界将在您旋转时保持静态,从而导致错误的 shadowPath。

import UIKit

class BackgroundView: UIView {

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        updateShadow(on: self)
    }

    func updateShadow(on background: UIView) {
        let layer = background.layer
        layer.shadowPath = UIBezierPath(rect: background.bounds).cgPath
        layer.masksToBounds = false
        layer.shadowColor = UIColor.black.cgColor
        layer.shadowOffset = CGSize(width: 0, height: 2)
        layer.shadowRadius = 4
        layer.shadowOpacity = 0.22
    }

}
  1. 确保您调用super.layoutSubviews()以处理任何自动布局约束。

  2. 您可以在 Storyboard 文件中设置自定义类。

于 2019-03-21T18:57:45.667 回答
0

为了提高性能,您可以使用 Core Graphics 绘制内部阴影。

UIView 层的内阴影效果

于 2012-11-13T19:05:21.840 回答