次のスニペットでは、UIViewの1つにドロップシャドウ効果を追加しています。これはかなりうまくいきます。しかし、ビューのmasksToBoundsプロパティを[〜#〜] yes [〜#〜]に設定するとすぐに。ドロップシャドウエフェクトはレンダリングされなくなりました。
self.myView.layer.shadowColor = [[UIColor blackColor] CGColor];
self.myView.layer.shadowOpacity = 1.0;
self.myView.layer.shadowRadius = 10.0;
self.myView.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);
self.myView.layer.cornerRadius = 5.0;
self.myView.layer.masksToBounds = YES; // <-- This is causing the Drop shadow to not be rendered
UIBezierPath *path = [UIBezierPath bezierPathWithCurvedShadowForRect:self.myView.bounds];
self.myView.layer.shadowPath = path.CGPath;
self.myView.layer.shouldRasterize = YES;
これについて何かアイデアはありますか?
シャドウはビューの外側で行われる効果であり、そのmasksToBoundsをYESに設定すると、UIViewにそれ自体の外側にあるものを描画しないように指示します。
影付きのroundedCornerビューが必要な場合は、2つのビューで行うことをお勧めします。
UIView *view1 = [[UIView alloc] init];
UIView *view2 = [[UIView alloc] init];
view1.layer.cornerRadius = 5.0;
view1.layer.masksToBounds = YES;
view2.layer.cornerRadius = 5.0;
view2.layer.shadowColor = [[UIColor blackColor] CGColor];
view2.layer.shadowOpacity = 1.0;
view2.layer.shadowRadius = 10.0;
view2.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);
[view2 addSubview:view1];
[view1 release];
現在はiOS 6であり、状況は変わっているかもしれません。 TheSquadの答えは、もう1行追加するまでうまくいきませんview2.layer.masksToBounds = NO;
、それ以外の場合、影は表示されません。ドキュメントでは、デフォルトでmasksToBounds
はNOと書かれていますが、私のコードは逆を示しています。
これが、アプリで最もよく使用されるコードスニペットの1つである、影付きの丸い角ボタンを作成する方法です。
button.layer.masksToBounds = YES;
button.layer.cornerRadius = 10.0f;
view.layer.masksToBounds = NO; // critical to add this line
view.layer.cornerRadius = 10.0f;
view.layer.shadowOpacity = 1.0f;
// set shadow path to prevent horrible performance
view.layer.shadowPath =
[UIBezierPath bezierPathWithRoundedRect:_button.bounds cornerRadius:10.0f].CGPath;
[view addSubview:button];
[〜#〜] edit [〜#〜]
ビューをアニメーション化またはスクロールする必要がある場合は、masksToBounds = YES
税パフォーマンスが大幅に向上します。つまり、おそらくアニメーションが途切れることになります。丸みを帯びた角と影を取得し、アニメーションまたはスクロールをスムーズにするには、代わりに次のコードを使用します。
button.backgroundColor = [UIColor clearColor];
button.layer.backgroundColor = [UIColor redColor].CGColor;
button.layer.masksToBounds = NO;
button.layer.cornerRadius = 10.0f;
view.layer.shadowOpacity = 0.5f;
view.layer.shadowPath = [UIBezierPath bezierPathWithRoundedRect:_button.bounds cornerRadius:10.0f].CGPath;
view.layer.shadowOffset = CGSizeMake(0.0f, 4.0f);
view.layer.shadowRadius = 2.0f;
view.layer.masksToBounds = NO;
view.layer.cornerRadius = 10.0f;
[view addSubview:button];
これは、@ TheSquadが投稿したSwift 3およびIBDesignableバージョンの回答です。
ストーリーボードファイルに変更を加えながら、同じ概念を使用しました。最初に、targetView(コーナー半径と影を必要とするもの)を新しいcontainerView。次に、次のコード行を追加し(参照: https://stackoverflow.com/a/35372901/419192 )、UIViewクラスのIBDesignable属性を追加しました。
@IBDesignable extension UIView {
/* The color of the shadow. Defaults to opaque black. Colors created
* from patterns are currently NOT supported. Animatable. */
@IBInspectable var shadowColor: UIColor? {
set {
layer.shadowColor = newValue!.cgColor
}
get {
if let color = layer.shadowColor {
return UIColor(cgColor: color)
}
else {
return nil
}
}
}
/* The opacity of the shadow. Defaults to 0. Specifying a value outside the
* [0,1] range will give undefined results. Animatable. */
@IBInspectable var shadowOpacity: Float {
set {
layer.shadowOpacity = newValue
}
get {
return layer.shadowOpacity
}
}
/* The shadow offset. Defaults to (0, -3). Animatable. */
@IBInspectable var shadowOffset: CGPoint {
set {
layer.shadowOffset = CGSize(width: newValue.x, height: newValue.y)
}
get {
return CGPoint(x: layer.shadowOffset.width, y:layer.shadowOffset.height)
}
}
/* The blur radius used to create the shadow. Defaults to 3. Animatable. */
@IBInspectable var shadowRadius: CGFloat {
set {
layer.shadowRadius = newValue
}
get {
return layer.shadowRadius
}
}
/* The corner radius of the view. */
@IBInspectable var cornerRadius: CGFloat {
set {
layer.cornerRadius = newValue
}
get {
return layer.cornerRadius
}
}
このコードを追加した後、ストーリーボードに戻り、containerViewを選択すると、属性インスペクターに新しい属性セットが見つかりました。
私の選択に従ってこれらの属性の値を追加する以外に、角の半径をtargetViewに追加し、masksToBoundsプロパティをtrueに設定します。
これが役立つことを願っています:)
@TheSquadでも同じ考えです。実際のビューの下に新しいビューを作成し、下のビューに影を追加します。
1。実際のビューの下にビューを作成します
ターゲットビューと同じ制約でUIView
をStoryBoardにドラッグします。ターゲットビューにバインドするクリップを確認します。また、ターゲットビューが新しいビューをカバーするように、新しいビューがターゲットビューの前にリストされていることを確認します。
2。新しいビューをコードにリンクして、シャドウを追加します
これは単なるサンプルです。ここで好きなようにできます
shadowView.layer.masksToBounds = false
shadowView.layer.shadowColor = UIColor.red.cgColor
shadowView.layer.shadowOpacity = 0.5
shadowView.layer.shadowOffset = CGSize(width: -1, height: 1)
shadowView.layer.shadowRadius = 3
shadowView.layer.shadowPath = UIBezierPath(rect: coverImage.bounds).cgPath
shadowView.layer.shouldRasterize = true
また、シャドウと丸みのあるコーナーでパフォーマンスが大幅に低下しました。 shadowPathパーツを使用する代わりに、パフォーマンスヒットを完全に解決する次の行を使用しました。
self.layer.shouldRasterize = YES;
self.layer.rasterizationScale = UIScreen.mainScreen.scale;
解決策の1つを次に示します。
@IBOutlet private weak var blockView: UIView! {
didSet {
blockView.backgroundColor = UIColor.white
blockView.layer.shadowColor = UIColor.black.cgColor
blockView.layer.shadowOpacity = 0.5
blockView.layer.shadowOffset = CGSize.zero
blockView.layer.cornerRadius = 10
}
}
@IBOutlet private weak var imageView: UIImageView! {
didSet {
imageView.layer.cornerRadius = 10
imageView.layer.masksToBounds = true
imageView.layer.shouldRasterize = true
}
}