При установке shadowPath тень UIImageView становится больше, чем предполагалось. - PullRequest
3 голосов
/ 06 октября 2011
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;                                                                                                                                                                            
}

Закомментированная строка приводит к тому, что тень становится больше, чем предполагалось.
(вертикальные более длинные тени сверху и снизу)
Я посмотрел справочник CALayer, но не получил подсказки.

1 Ответ

0 голосов
/ 06 декабря 2017

Это, вероятно, потому что UIView bounds еще не настоящий.(Как в awakeFromNib или viewDidLoad)

Подождите, пока будет вызвано представление layoutSubviews или viewController viewWillLayoutSubviews, и обновите путь вашей тени там.

Я создалэто быстрое расширение, чтобы добавить ту же тень (с поддержкой cornerRadius) везде, где мне нужно:

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
    }
}
...