Làm cách nào để thêm bóng đổ vào UIButton?


76

Tôi muốn thêm bóng đổ vào UIButton. Tôi đã cố gắng sử dụng thuộc tính self.layer.shadow *. Các thuộc tính đó hoạt động trong UIView, nhưng chúng hoạt động khác nhau trong UIButton. Tôi thực sự sẽ đánh giá cao nó nếu tôi có thể nhận được bất kỳ con trỏ nào để vẽ bóng đổ. Cảm ơn bạn!

self.layer.cornerRadius = 8.0f;
self.layer.masksToBounds = YES;
self.layer.borderWidth = 1.0f;

self.layer.shadowColor = [UIColor greenColor].CGColor;
self.layer.shadowOpacity = 0.8;
self.layer.shadowRadius = 12;
self.layer.shadowOffset = CGSizeMake(12.0f, 12.0f);

Hướng dẫn hoạt ảnh cốt lõi, developer.apple.com/mac/library/documentation/cocoa/conceptual/… , cho biết: Hệ điều hành iPhone Lưu ý: Khi xem xét hiệu suất, Hệ điều hành iPhone không hỗ trợ các thuộc tính shadowColor, shadowOffset, shadowOpacity và shadowRadius. Dang.
d_CFO

Thuộc tính này hiện đã được hỗ trợ kể từ iOS 3.2. Trân trọng,
Quentin

Câu trả lời:


100

Chỉ có một lỗi nhỏ trong câu hỏi khiến bóng không được hiển thị: masksToBounds:YEScũng che bóng! Đây là mã chính xác:

self.layer.cornerRadius = 8.0f;
self.layer.masksToBounds = NO;
self.layer.borderWidth = 1.0f;

self.layer.shadowColor = [UIColor greenColor].CGColor;
self.layer.shadowOpacity = 0.8;
self.layer.shadowRadius = 12;
self.layer.shadowOffset = CGSizeMake(12.0f, 12.0f);

Thật không may, điều này có nghĩa là chúng tôi không thể che giấu nội dung và có bóng cùng một lúc mà không có thủ thuật.

Ghi nhớ #import <QuartzCore/QuartzCore.h>.


62

Đây là một giải pháp dễ dàng nếu bạn đang sử dụng UIButton:

#import <QuartzCore/QuartzCore.h>

button.imageView.layer.cornerRadius = 7.0f;
button.layer.shadowRadius = 3.0f;
button.layer.shadowColor = [UIColor blackColor].CGColor;
button.layer.shadowOffset = CGSizeMake(0.0f, 1.0f);
button.layer.shadowOpacity = 0.5f;
button.layer.masksToBounds = NO;

Chỉ cần nó hoạt động và nhận ra nó đáng để đăng. Hy vọng rằng sẽ giúp!


1
giải pháp rất thanh lịch! Cảm ơn!
Vitalii Gozhenko

1
hoạt động hoàn hảo ... ngay cả khi tôi không nhập "<QuartzCore / QuartzCore.h>" Công việc của nó đối với tôi .. về người khác mà tôi không biết.
g212gs

nếu bạn làm theo cách này sẽ làm cho liên lạc trợ giúp của bạn tụt hậu trong bàn phím tùy chỉnh
TomSawyer

39

Đây là một lớp con không chỉ tạo bóng đổ mà nút sẽ hoạt ảnh xuống khi bạn nhấn vào nó.

//
//  ShadowButton.h

#import <Foundation/Foundation.h>

@interface ShadowButton : UIButton {
}

@end

//
//  ShadowButton.m

#import "ShadowButton.h"
#import <QuartzCore/QuartzCore.h>

@implementation ShadowButton

-(void)setupView{

    self.layer.shadowColor = [UIColor blackColor].CGColor;
    self.layer.shadowOpacity = 0.5;
    self.layer.shadowRadius = 1;
    self.layer.shadowOffset = CGSizeMake(2.0f, 2.0f);

}

-(id)initWithFrame:(CGRect)frame{
    if((self = [super initWithFrame:frame])){
        [self setupView];
    }

    return self;
}

-(id)initWithCoder:(NSCoder *)aDecoder{
    if((self = [super initWithCoder:aDecoder])){
        [self setupView];
    }

    return self;
}

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    self.contentEdgeInsets = UIEdgeInsetsMake(1.0,1.0,-1.0,-1.0);
    self.layer.shadowOffset = CGSizeMake(1.0f, 1.0f);
    self.layer.shadowOpacity = 0.8;

    [super touchesBegan:touches withEvent:event];

}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    self.contentEdgeInsets = UIEdgeInsetsMake(0.0,0.0,0.0,0.0);
    self.layer.shadowOffset = CGSizeMake(2.0f, 2.0f);
    self.layer.shadowOpacity = 0.5;

    [super touchesEnded:touches withEvent:event];

}

@end

3

Bạn có thể tạo một lớp con và định cấu hình các giá trị của nó trong Xcode

Dưới đây là một ví dụ:

import UIKit
import QuartzCore

@IBDesignable
class CustomButton: UIButton {

@IBInspectable var cornerRadius: CGFloat = 0 {
    didSet {
        layer.cornerRadius = cornerRadius
    }
}

@IBInspectable var borderWidth: CGFloat = 0 {
    didSet {
        layer.borderWidth = borderWidth
    }
}

@IBInspectable var borderColor: UIColor = UIColor.gray {
    didSet {
        layer.borderColor = borderColor.cgColor
    }
}

@IBInspectable var shadowColor: UIColor = UIColor.gray {
    didSet {
        layer.shadowColor = shadowColor.cgColor
    }
}

@IBInspectable var shadowOpacity: Float = 1.0 {
    didSet {
        layer.shadowOpacity = shadowOpacity
    }
}

@IBInspectable var shadowRadius: CGFloat = 1.0 {
    didSet {
        layer.shadowRadius = shadowRadius
    }
}

@IBInspectable var masksToBounds: Bool = true {
    didSet {
        layer.masksToBounds = masksToBounds
    }
}

@IBInspectable var shadowOffset: CGSize = CGSize(width: 12, height: 12) {
    didSet {
        layer.shadowOffset = shadowOffset
    }
}


 }

2

Bạn có thể phân lớp UIButton và ghi đè lên phương thức drawRect: và thêm bóng đổ theo cách thủ công. Đó là nhiều công việc hơn và bây giờ bạn nên một vài điều về thạch anh 2d, nhưng kết quả là chính xác những gì bạn muốn. Nếu không, bạn có thể chỉ thêm một hình ảnh, nhưng tôi thích lớp con UIButton, vì nó rất linh hoạt về kích thước của nút, nó tổng quát hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.