Тень слева и справа от UIView

Привет, мне нравится добавлять тень CALayer в представление, где тень была слева и справа от представления, самым простым способом было:

someView.layer.shadowColor = [[UIColor blackColor] CGColor];
someView.layer.shadowOffset = CGSizeMake(0.0f,0.0f);
someView.layer.shadowOpacity = 1.0f;
someView.layer.shadowRadius = 10.0f;
someView.layer.shadowPath = [[UIBezierPath bezierPathWithRect:someView.bounds] CGPath];

но я добавлю большую тень, как тень, когда я увеличиваю shadowRadius, это выглядит не очень хорошо. Как я могу сделать тень, которая хорошо выглядит слева и справа.


person Zeropointer    schedule 08.01.2013    source источник


Ответы (4)


Я думаю, что 10 — довольно большой радиус тени, попробуйте вместо этого 3 или 4, а также непрозрачность, которую я обычно использую 0,7:

someView.layer.shadowColor = [[UIColor blackColor] CGColor];
someView.layer.shadowOffset = CGSizeMake(0.0f,0.0f);
someView.layer.shadowOpacity = 0.7f;
someView.layer.shadowRadius = 4.0f;

Если вам нужна тень только слева и справа, вставьте прямоугольник сверху и снизу, чтобы верхняя и нижняя тени были скрыты за вашим видом:

CGRect shadowRect = CGRectInset(someView.bounds, 0, 4);  // inset top/bottom
someView.layer.shadowPath = [[UIBezierPath bezierPathWithRect:shadowRect] CGPath];

Я не совсем уверен, что ты этого хотел.

person progrmr    schedule 08.01.2013
comment
Я поговорил со своим дизайнером, эта тень слишком мала. Мне нужны разные смещения x слева и справа. - person Zeropointer; 08.01.2013
comment
Удивительный ответ, но, ребята, кто-то реализовал это с закругленными углами (более гладкими), так как эта прямоугольная тень выглядит плохо. Любые идеи? Заранее спасибо ! :) - person l.vasilev; 16.05.2016
comment
Вместо этого используйте bezierPathWithRoundedRect - person progrmr; 17.05.2016
comment
Я не уверен, почему у этого так много голосов. В моей реализации, как и ожидалось, он не позволяет боковым теням доходить до верха и низа сторон. - person mattsson; 07.02.2017
comment
@progrmr Мне нужна внутренняя тень с определенной стороны, например, только сверху или сверху/справа. Какие-либо предложения ? - person Mitesh Dobareeya; 27.03.2018

версия Swift 3.0

imageView.layer.shadowOpacity = 0.8
imageView.layer.shadowOffset = CGSize(width: 0, height: 3)
imageView.layer.shadowRadius = 4.0

let shadowRect: CGRect = imageView.bounds.insetBy(dx: 0, dy: 4)
imageView.layer.shadowPath = UIBezierPath(rect: shadowRect).cgPath
person Fangming    schedule 06.07.2017

ответ progrmr был очень полезен, ура!

Я сделал выдвижное меню, и у меня возникла проблема с тенью, окружающей мой VC и нарушающей работу панели навигации. Оказалось, что мне пришлось вставить слой с тенью.

Вот мое решение с использованием swift:

rightViewController!.view.layer.shadowOpacity = 0.8
rightViewController!.view.layer.shadowOffset = CGSizeMake(0, 3)
rightViewController!.view.layer.shadowRadius = 4.0

let shadowRect: CGRect = CGRectInset(rightViewController!.view.bounds, 0, 4);  // inset top/bottom
rightViewController!.view.layer.shadowPath = UIBezierPath(rect: shadowRect).CGPath
person Johan Tingbacke    schedule 27.06.2016

Я создал тень, которую можно использовать сверху/снизу или слева/справа без каких-либо предубеждений. Слева/справа тени не появятся, если вы выберете верх/низ и так далее. Надеюсь, я помог. Вот код:


import UIKit

class ViewController: UIViewController {
  
    
     override func viewDidLoad() {
        super.viewDidLoad()
        
        let imgView = UIImageView(frame: CGRect(x: self.view.bounds.midX - 150, y: self.view.bounds.midY - 150, width: 300, height: 300))
            
        imgView.contentMode = .scaleToFill
        imgView.image = UIImage(named: "name image")

        self.view.addSubview(imgView)
        //You can put left/right or top/bottom
        imgView.addShadow(sides: .leftRight, constant: 10, alpha: 5)

        
     }

}

extension UIView{
    
    func addShadow(sides: Sides, constant: Int, alpha: Int){
        if(constant > 0 && alpha > 0){
        switch sides {
            case .leftRight:
   
                let view = UIView(frame: CGRect(x: -CGFloat(constant), y: 0, width: self.bounds.width + CGFloat((constant * 2)), height: self.bounds.height))
                self.addSubview(view)

                addMask(sides: .leftRight, view: view, constant: constant, shadowRadius: alpha)
                
            case .topBottom:

                let view = UIView(frame: CGRect(x: 0, y: -CGFloat(constant), width: self.bounds.width , height: self.bounds.height + CGFloat(constant * 2)))
                self.addSubview(view)

                addMask(sides: .topBottom, view: view, constant: constant, shadowRadius: alpha)

            }
        }
    }
    
    private func addMask(sides:Sides, view: UIView, constant: Int, shadowRadius:Int){
        let mutablePath = CGMutablePath()
        let mask = CAShapeLayer()

        switch sides {
        case .leftRight:
            
            mutablePath.addRect(CGRect(x: -CGFloat(constant), y: 0, width: view.bounds.width, height: view.bounds.height))

            mutablePath.addRect(CGRect(x: CGFloat(constant) , y: 0, width: view.bounds.width , height: view.bounds.height))

            
        case .topBottom:
            
            mutablePath.addRect(CGRect(x: 0, y: -CGFloat(constant), width: view.bounds.width, height: view.bounds.height))

            mutablePath.addRect(CGRect(x: 0, y: CGFloat(constant) , width: view.bounds.width , height: view.bounds.height))
        }

        mask.path = mutablePath

        mask.fillRule = CAShapeLayerFillRule.evenOdd
        mask.fillColor  = UIColor(white:1.0, alpha: 0.2).cgColor
        view.layer.mask = mask
        view.layer.addSublayer(mask)
        mask.shadowColor = UIColor.black.cgColor
        mask.shadowRadius = CGFloat(shadowRadius)
        mask.shadowOpacity = 1.0
        mask.shadowOffset = CGSize(width: 0, height: 0)

    }
}

enum Sides{
    case leftRight
    case topBottom
}

Вам просто нужно вызвать расширение UIView, которое имеет функцию addShadow() и передать нужные параметры.

введите здесь описание изображения

введите здесь описание изображения

person GuimarãesGabrielG    schedule 05.05.2021