신속한 3을 사용하여 UIView에 그림자 추가
이전 신속한 3 나는 다음과 같이 UIView에 그림자를 추가했습니다.
//toolbar is an UIToolbar (UIView)
toolbar.layer.masksToBounds = false
toolbar.layer.shadowOffset = CGSize(width: -1, height: 1)
toolbar.layer.shadowRadius = 1
toolbar.layer.shadowOpacity = 0.5
하지만 위의 코드는 swift 3에서 작동하지 않습니다. 그림자 대신 전체 뷰의 색상이 못생긴 회색으로 바뀝니다.
누구든지 스위프트 3에 그림자를 추가하는 방법을 알고 있습니까?
코드 스 니펫 :
extension UIView {
// OUTPUT 1
func dropShadow(scale: Bool = true) {
layer.masksToBounds = false
layer.shadowColor = UIColor.black.cgColor
layer.shadowOpacity = 0.5
layer.shadowOffset = CGSize(width: -1, height: 1)
layer.shadowRadius = 1
layer.shadowPath = UIBezierPath(rect: bounds).cgPath
layer.shouldRasterize = true
layer.rasterizationScale = scale ? UIScreen.main.scale : 1
}
// OUTPUT 2
func dropShadow(color: UIColor, opacity: Float = 0.5, offSet: CGSize, radius: CGFloat = 1, scale: Bool = true) {
layer.masksToBounds = false
layer.shadowColor = color.cgColor
layer.shadowOpacity = opacity
layer.shadowOffset = offSet
layer.shadowRadius = radius
layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
layer.shouldRasterize = true
layer.rasterizationScale = scale ? UIScreen.main.scale : 1
}
}
참고 : 당신이 통과하지 않을 경우 어떤 그 함수에 매개 변수를 다음 규모의 인수가 기본적으로 true가됩니다. 매개 변수 유형 뒤에 값을 할당하여 함수의 모든 매개 변수에 대한 기본값을 정의 할 수 있습니다. 기본값이 정의 된 경우 함수를 호출 할 때 해당 매개 변수를 생략 할 수 있습니다.
출력 1 :
shadowView.dropShadow()
출력 2 :
shadowView.dropShadow(color: .red, opacity: 1, offSet: CGSize(width: -1, height: 1), radius: 3, scale: true)
layer.shouldRasterize = true
그림자를 정적으로 만들고의 초기 상태에 그림자를UIView
만듭니다. 따라서layer.shouldRasterize = true
.NET 내부 뷰와 같은 동적 레이아웃 에서는 사용하지 않는 것이 좋습니다UITableViewCell
.
UIView Extension Swift 4를 사용한 그림자
선택한 답변으로 한 줄 더 추가하고 싶습니다! 레이어를 래스터화할 때 레티 나 디스플레이를 위해 2.0으로 설정해야합니다. 그렇지 않으면 해당 뷰의 레이블 텍스트 또는 이미지가 흐릿하게 표시됩니다. 그래서 우리는 rasterizationScale
또한 추가해야합니다 .
extension UIView {
func dropShadow() {
self.layer.masksToBounds = false
self.layer.shadowColor = UIColor.black.cgColor
self.layer.shadowOpacity = 0.5
self.layer.shadowOffset = CGSize(width: -1, height: 1)
self.layer.shadowRadius = 1
self.layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
self.layer.shouldRasterize = true
self.layer.rasterizationScale = UIScreen.main.scale
}
}
매우 간단하고 몇 줄의 코드 :
let viewShadow = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
viewShadow.center = self.view.center
viewShadow.backgroundColor = UIColor.yellow
viewShadow.layer.shadowColor = UIColor.red.cgColor
viewShadow.layer.shadowOpacity = 1
viewShadow.layer.shadowOffset = CGSize.zero
viewShadow.layer.shadowRadius = 5
self.view.addSubview(viewShadow)
이것은 나를 위해 작동합니다 (Swift 3 및 4)
yourView.layer.shadowColor = UIColor.gray.cgColor
yourView.layer.shadowOpacity = 0.3
yourView.layer.shadowOffset = CGSize.zero
yourView.layer.shadowRadius = 6
만 허용 대답은 위대하고 그것이 정상적으로 작동, 나는 분할에 수정 한 offSet: CGSize
로 offsetX: CGFloat
와 offsetY: CGFloat
.
extension UIView {
func dropShadow(offsetX: CGFloat, offsetY: CGFloat, color: UIColor, opacity: Float, radius: CGFloat, scale: Bool = true) {
layer.masksToBounds = false
layer.shadowOffset = CGSize(width: offsetX, height: offsetY)
layer.shadowColor = color.cgColor
layer.shadowOpacity = opacity
layer.shadowRadius = radius
layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
layer.shouldRasterize = true
layer.rasterizationScale = scale ? UIScreen.main.scale : 1
}
}
스토리 보드에서 직접 편집 할 수있는 UIView 용 확장을 사용하기 매우 쉽습니다. Swift 4+
@IBDesignable extension UIView {
@IBInspectable var shadowColor: UIColor?{
set {
guard let uiColor = newValue else { return }
layer.shadowColor = uiColor.cgColor
}
get{
guard let color = layer.shadowColor else { return nil }
return UIColor(cgColor: color)
}
}
@IBInspectable var shadowOpacity: Float{
set {
layer.shadowOpacity = newValue
}
get{
return layer.shadowOpacity
}
}
@IBInspectable var shadowOffset: CGSize{
set {
layer.shadowOffset = newValue
}
get{
return layer.shadowOffset
}
}
@IBInspectable var shadowRadius: CGFloat{
set {
layer.shadowRadius = newValue
}
get{
return layer.shadowRadius
}
}
}
둥근 그림자가 필요한 경우. 신속한 4.2에서 작동
extension UIView {
func dropShadow() {
var shadowLayer: CAShapeLayer!
let cornerRadius: CGFloat = 16.0
let fillColor: UIColor = .white
if shadowLayer == nil {
shadowLayer = CAShapeLayer()
shadowLayer.path = UIBezierPath(roundedRect: bounds, cornerRadius: cornerRadius).cgPath
shadowLayer.fillColor = fillColor.cgColor
shadowLayer.shadowColor = UIColor.black.cgColor
shadowLayer.shadowPath = shadowLayer.path
shadowLayer.shadowOffset = CGSize(width: -2.0, height: 2.0)
shadowLayer.shadowOpacity = 0.8
shadowLayer.shadowRadius = 2
layer.insertSublayer(shadowLayer, at: 0)
}
}
}
이것을 시도하십시오
func applyShadowOnView(_ view: UIView) {
view.layer.cornerRadius = 8
view.layer.shadowColor = UIColor.darkGray.cgColor
view.layer.shadowOpacity = 1
view.layer.shadowOffset = .zero
view.layer.shadowRadius = 5
}
loginView.layer.shadowOpacity = 1.0
스위프트 4
toolbar.layer.shadowColor = UIColor.hex(hexColor: "#000000", withAlpha: 1.0).cgColor
toolbar.layer.shadowOffset = CGSize.zero
toolbar.layer.shadowRadius = 1
toolbar.layer.shadowOpacity = 1
toolbar.layer.shouldRasterize = true
toolbar.layer.masksToBounds = false
보기에 대한 IBInspectable 속성으로 사용하려면이 확장을 추가 할 수 있습니다.
import UIKit
extension UIView {
private static var _addShadow:Bool = false
@IBInspectable var addShadow:Bool {
get {
return UIView._addShadow
}
set(newValue) {
if(newValue == true){
layer.masksToBounds = false
layer.shadowColor = UIColor.black.cgColor
layer.shadowOpacity = 0.075
layer.shadowOffset = CGSize(width: 0, height: -3)
layer.shadowRadius = 1
layer.shadowPath = UIBezierPath(rect: bounds).cgPath
layer.shouldRasterize = true
layer.rasterizationScale = UIScreen.main.scale
}
}
}
}
다음과 같은 방법으로 그림자를 적용 할 수도 있습니다.
cell.view1.layer.masksToBounds = false
cell.view1.layer.shadowColor = UIColor.lightGray.cgColor
cell.view1.backgroundColor = UIColor.white
cell.view1.layer.shadowOffset = CGSize(width: 1.0, height: 1.0)
cell.view1.layer.shadowOpacity = 0.5
결과는 다음과 같습니다. http://prntscr.com/nhhv2s
이것을 시도하십시오, 그것은 나를 위해 일하고 있습니다.
extension UIView {
func dropShadow() {
layer.shadowColor = UIColor.black.cgColor
layer.shadowOffset = CGSize(width: 2, height: 3)
layer.masksToBounds = false
layer.shadowOpacity = 0.3
layer.shadowRadius = 3
//layer.shadowPath = UIBezierPath(rect: bounds).cgPath
layer.rasterizationScale = UIScreen.main.scale
layer.shouldRasterize = true
}}
Swift 5이 함수를 호출하고 뷰를 전달하십시오.
public func setViewSettingWithBgShade(view: UIView)
{
view.layer.cornerRadius = 8
view.layer.borderWidth = 1
view.layer.borderColor = AppTextFieldBorderColor.cgColor
//MARK:- Shade a view
view.layer.shadowOpacity = 0.5
view.layer.shadowOffset = CGSize(width: 1.0, height: 1.0)
view.layer.shadowRadius = 3.0
view.layer.shadowColor = UIColor.black.cgColor
view.layer.masksToBounds = false
}
뷰 위에 그림자를 적용합니다.
func applyShadowOnView(_ view:UIView) {
view.layer.cornerRadius = 8
view.layer.shadowColor = UIColor.darkGray.cgColor
view.layer.shadowOpacity = 1
view.layer.shadowOffset = CGSize.zero
view.layer.shadowRadius = 5
}
참조 URL : https://stackoverflow.com/questions/39624675/add-shadow-on-uiview-using-swift-3
'Programing' 카테고리의 다른 글
C #에는 다중 상속이 있어야합니까? (0) | 2021.01.09 |
---|---|
최근 애플리케이션 목록에서 애플리케이션을 제거하는 방법은 무엇입니까? (0) | 2021.01.09 |
'UserControl'유형은 직접 콘텐츠를 지원하지 않습니다. (0) | 2021.01.09 |
단수 또는 복수 데이터베이스 테이블 이름? (0) | 2021.01.09 |
드래그 가능한 복제본을 만들어서 드롭 가능에 놓으면 다시 드래그 할 수 없습니다. (0) | 2021.01.08 |