开发者

UIImageView's shadow gets bigger than intended when shadowPath is set

开发者 https://www.devze.com 2023-04-11 00:34 出处:网络
CGRect rect = biggerImageView.bounds; if([biggerImageView.layer respondsToSelector:@selector(setShadowColor:)])
CGRect rect = biggerImageView.bounds;
if([biggerImageView.layer respondsToSelector:@selector(setShadowColor:)])
{
    float shadowOffset = rect.size.width * 0.02;
    biggerImageView.layer.shadowColor = [UIColor colorWithWhite: 0.25 alpha: 0.55].CGColor;
    biggerImageView.layer.shadowOffset = CGSizeMake(shadowOffset, shadowOffset);
    biggerImageView.layer.shadowOpacity = 0.8;
    //      biggerImageView.layer.shadowPath = [UIBezierPath bezierPathWithRect: rect].CGPath;                                                                                                                                                                            
}

The commented out line causes the shadow becomes bigger than intended.

(vertically longe开发者_运维问答r shadows on top and bottom)

I looked up CALayer reference but got no clue there.


That is probably because the UIView bounds is not the real one yet. (Like in awakeFromNib or viewDidLoad)

Wait for the view layoutSubviews or viewController viewWillLayoutSubviews to be called, and update the path of your shadow there.

I created this swift extension to add the same shadow (with cornerRadius support) everywhere I need to :

import UIKit

extension UIView {
    /// Call this from `layoutSubviews` or `viewWillLayoutSubviews`.
    /// The shadow will be the same color as this view background.
    func layoutShadow() {

        // Update frame
        if let shadowView = superview?.viewWithTag(978654123) {
            shadowView.frame = frame
            shadowView.layer.shadowPath = UIBezierPath(roundedRect: bounds, cornerRadius: layer.cornerRadius).cgPath
            return
        }

        // Create the shadow the first time
        let shadowView = UIView(frame: frame)
        shadowView.tag = 978654123
        shadowView.translatesAutoresizingMaskIntoConstraints = false
        superview?.insertSubview(shadowView, belowSubview: self)

        shadowView.layer.shadowColor = (backgroundColor ?? UIColor.black).cgColor
        shadowView.layer.shadowOpacity = 0.8
        shadowView.layer.shadowOffset = CGSize(width: -2.0, height: 4.0)
        shadowView.layer.shadowRadius = 4.0
        shadowView.layer.shadowPath = UIBezierPath(roundedRect: bounds, cornerRadius: layer.cornerRadius).cgPath
    }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号