UIView with shadow, rounded corners and custom drawRect

前端 未结 16 1443
南旧
南旧 2020-12-02 05:22

I have to create a custom UIView that will have round corners, a border, a shadow and its drawRect() method is overridden to provide custom drawing

16条回答
  •  忘掉有多难
    2020-12-02 05:48

    This is my solution. If you have multiple type of views like UIView, UIControl, UITableView and so on, and don't want to make subclasses of each of them, or you want to add this effect with smallest changes to your code, then this might be what you are looking for.

    Objective-C.h

    #import 
    
    @interface UIView (CornerAndShadow)
    
    - (void)setCornerAndShadow;
    
    @end
    

    Objective-C.m

    #import "UIView+CornerAndShadow.h"
    #import 
    
    @implementation UIView (CornerAndShadow)
    
    - (void)setCornerAndShadow {
        // constants
        CGFloat fCornerRadius = 9.f;
    
        // only work for views with superview
        if (self.superview == nil) {
            return;
        }
    
        // set corner
        self.layer.cornerRadius = fCornerRadius;
        self.layer.masksToBounds = YES;
    
        // create and configure shadowView
        UIView *shadowView = [UIView new];
        shadowView.backgroundColor = self.backgroundColor; // just to make shadow visible
        shadowView.layer.cornerRadius = fCornerRadius;
        shadowView.layer.shadowColor = [UIColor redColor].CGColor;
        shadowView.layer.shadowOffset = CGSizeMake(0, 3.f);
        shadowView.layer.shadowOpacity = 0.5f;
        shadowView.layer.shadowRadius = 5.f;
    
        // put shadowView into superview right below self
        [self.superview insertSubview:shadowView belowSubview:self];
    
        // set shadowView's frame equal to self
        [shadowView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.edges.equalTo(self);
        }];
        // use this if you're not using autolayout, and can get real frame here
        // shadowView.frame = self.frame;
    }
    
    @end
    

提交回复
热议问题