UIViewに下のみの影を作成したい。現在、この機能を使用すると、上下左右に影が作成されます。
func setCardView(view : UIView){
view.layer.masksToBounds = false
view.layer.shadowOffset = CGSize(width: 0, height: 0)
view.layer.shadowRadius = 2
view.layer.shadowOpacity = 0.5
}
とにかく下に影を作成するだけですか?任意の助けをいただければ幸いです。ありがとうございました!
影の適切な考え方は、影はオブジェクトの一部であり、ボタンの一部であるuiviewに属しているだけだと思います。仮想光源があると想像してください。片側だけの影を作ることはできません。
そうは言っても、影は常にビュー全体の影になります。ただし、シャドウオフセットを変更して、下に向けることができます。
view.layer.shadowOffset = CGSize(width: 0, height: 3)
これは、光源が上から光を放ち、影が下になるようにすることを意味します。上部にまだ影が見える理由は、影の半径です。これは、光のdiffuse
をシミュレートすることです。ライトが拡散するほど、シャドウは柔らかくなり、トップシャドウが表示されたままになります。
view.layer.shadowRadius = 1 or 0.5
半径も小さくしてください。より良い視覚的な結果が得られます。
必要に応じて、umbra、penumbra、antumbraを理解するには、 https://en.wikipedia.org/wiki/Umbra,_penumbra_and_antumbra をご覧ください。
shadowOffset
を変更します
view.layer.shadowOffset = CGSize(width: 0, height: 3)
Swift 4で機能するこのコードと、ビューの下部に適用されるシャドウ:
view.layer.masksToBounds = false
view.layer.shadowRadius = 4
view.layer.shadowOpacity = 1
view.layer.shadowColor = UIColor.gray.cgColor
view.layer.shadowOffset = CGSize(width: 0 , height:2)
Swiftでシャドウを適用する適切な方法は次のとおりです。
yourView.layer.shadowOffset = CGSize(width: 0, height: 3)
yourView.layer.shadowOpacity = 0.6
yourView.layer.shadowRadius = 3.0
yourView.layer.shadowColor = UIColor.red.cgColor
UIView
の片側だけにシャドウが必要な場合は、view.layer.shadowPath
をUIBezierPath
に設定する必要があります。
以下は、ビューの下部にのみ影を表示する例です。
view.layer.shadowPath = UIBezierPath(rect: CGRect(x: 0,
y: bounds.maxY - layer.shadowRadius,
width: bounds.width,
height: layer.shadowRadius)).cgPath
CGRect
値を分解すると、以下が得られます。
x
およびwidth
は、ビューの水平方向の幅全体に影がかかることを確認します(たとえば、layer.shadowRadius
値をオフセットのベースとして使用して、影を調整することもできます)y
およびheight
は、シャドウができるだけ低く開始し、半径と同じ大きさであることを確認しますもちろん、ビューのshadowRadius
よりも大きいheight
が必要な場合など、これが機能しない場合があります。これらの場合、画像ビューまたはマスクされたレイヤーを使用することをお勧めします。
お役に立てれば、
古い質問ですが、答えのどれも本当に質問に答えていないようです。上記の回答は低いshadowRadius
で機能しますが、実際には「シャドウ」効果は得られません。
UIBezierPath
を使用すると、一番下にのみ影を追加できます。
Heres how-
let shadowWidth: CGFloat = 1.2 // Shadow width, will be the width furthest away from the view, this is equivalent to 120% of the views width
let shadowHeight: CGFloat = 0.3 // Shadow height, again this is equivalent to 30%
let shadowRadius: CGFloat = 5
let width = someView.frame.width
let height = someView.frame.height // Get width and height of the view
// Plot the path
let shadowPath = UIBezierPath()
shadowPath.move(to: CGPoint(x: shadowRadius / 2, y: height - shadowRadius / 2))
shadowPath.addLine(to: CGPoint(x: width - shadowRadius / 2, y: height - shadowRadius / 2))
shadowPath.addLine(to: CGPoint(x: width * shadowWidth, y: height + (height * shadowHeight)))
shadowPath.addLine(to: CGPoint(x: width * -(shadowWidth - 1), y: height + (height * shadowHeight)))
// Add shadow
someView.layer.shadowPath = shadowPath.cgPath
someView.layer.shadowRadius = shadowRadius
someView.layer.shadowOffset = .zero
someView.layer.shadowOpacity = 0.2
これはこれを出力します
または、より少ないオプションでよりシンプルなソリューションが必要な場合は、これで行くことができます
let buttonHeight = someButton.frame.height
let buttonWidth = someButton.frame.width
let shadowSize: CGFloat = 15
let contactRect = CGRect(x: -shadowSize, y: buttonHeight - (shadowSize * 0.2), width: buttonWidth + shadowSize * 2, height: shadowSize)
someButton.layer.shadowPath = UIBezierPath(ovalIn: contactRect).cgPath
someButton.layer.shadowRadius = 5
someButton.layer.shadowOpacity = 0.6
これはこれを出力します
ここの例