Set background color for only part of UIView

前端 未结 6 2649
生来不讨喜
生来不讨喜 2021-02-20 09:33

I want the bottom (not quite half) of my UIView to be a different color than the top.

I\'m wondering if I should create a CGRect and then color that? Is this along the r

相关标签:
6条回答
  • 2021-02-20 10:03

    Override the drawRect method of your UIView Subclass. The following code will make the top half of your view black and the bottom half of your view red.

    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    - (void)drawRect:(CGRect)rect
    {
        // Top View
        CGRect topRect = {CGRectGetMinX(self.bounds), CGRectGetMinY(self.bounds), CGRectGetMaxX(self.bounds), CGRectGetMaxY(self.bounds)};
        [[UIColor blackColor] setFill];
        UIRectFill(topRect);
    
        // Bottom View
        CGRect bottomRect = {CGRectGetMinX(self.bounds), CGRectGetMidY(self.bounds), CGRectGetMaxX(self.bounds), CGRectGetMidY(self.bounds)};
        [[UIColor redColor] setFill];
        UIRectFill(bottomRect);
    }
    

    NOTE: Also you can only override the drawRect: method when you subclass a UIView. Based on your comment view I have a feeling this is not what you are doing.

    0 讨论(0)
  • 2021-02-20 10:08

    You can also add an CALayer as a sub layer to your view. Include CoreGraphics and QuartzCore frameworks and create a CGRect with the desired form factor in your drawRect method. Instantiate a CALayer with the rect and add it to the view's layer using [self.layer addSublayer:theLayer]. Before adding it use the CALayer's -setBackgroundColor: method.

    If this is inside of a View Controller instead of a View subclass, do exactly the same in the viewDidLoad method.

    Bryan

    0 讨论(0)
  • 2021-02-20 10:09

    You can do a CGRect and clip a part of a portion to fill.

    But why won't try two different UIViews placed next to each other?

    Bharath

    0 讨论(0)
  • 2021-02-20 10:10

    Yes, as you are already overriding drawRect method, this will do.

    - (void)drawRect:(CGRect)rect { 
    
        CGRect topRect = CGRectMake(0, 0, rect.size.width, rect.size.height/2.0);
        // Fill the rectangle with grey
        [[UIColor greyColor] setFill];
        UIRectFill( topRect );
    
        CGRect bottomRect = CGRectMake(0, rect.size.height/2.0, rect.size.width, rect.size.height/2.0);
        [[UIColor redColor] setFill];
        UIRectFill( bottomRect );
    
    }
    

    Change the values inside the frames as you wish.

    0 讨论(0)
  • 2021-02-20 10:14

    With Swift 5.1 and iOS 13, you may choose one of the two following ways in order to solve your problem.


    #1. Draw and fill a specified CGRect instance with a UIColor instance inside a UIView subclass using UIRectFill(_:) function

    UIKit provides a UIRectFill(_:) function. UIRectFill(_:) has the following declaration:

    func UIRectFill(_ rect: CGRect)
    

    Fills the specified rectangle with the current color.

    The following Playground code shows how to use UIRectFill(_:):

    import UIKit
    import PlaygroundSupport
    
    class CustomView: UIView {
    
        override init(frame: CGRect) {
            super.init(frame: frame)
    
            backgroundColor = UIColor.green
        }
    
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
        override func draw(_ rect: CGRect) {
            super.draw(rect)
    
            let bottomRect = CGRect(
                origin: CGPoint(x: rect.origin.x, y: rect.height / 2),
                size: CGSize(width: rect.size.width, height: rect.size.height / 2)
            )
            UIColor.red.set()
            UIRectFill(bottomRect)
        }
    
    }
    
    let view = CustomView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
    PlaygroundPage.current.liveView = view
    

    #2. Draw and fill a specified CGRect instance with a UIColor instance inside a UIView subclass using CGContext's fill(_:) method

    CGContext has a method called fill(_:). fill(_:) has the following declaration:

    func fill(_ rect: CGRect)
    

    Paints the area contained within the provided rectangle, using the fill color in the current graphics state.

    The following Playground code shows how to use fill(_:):

    import UIKit
    import PlaygroundSupport
    
    class CustomView: UIView {
    
        override init(frame: CGRect) {
            super.init(frame: frame)
    
            backgroundColor = UIColor.green
        }
    
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
        override func draw(_ rect: CGRect) {
            super.draw(rect)
    
            let bottomRect = CGRect(
                origin: CGPoint(x: rect.origin.x, y: rect.height / 2),
                size: CGSize(width: rect.size.width, height: rect.size.height / 2)
            )
            UIColor.red.set()
            guard let context = UIGraphicsGetCurrentContext() else { return }
            context.fill(bottomRect)
        }
    
    }
    
    let view = CustomView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
    PlaygroundPage.current.liveView = view
    
    0 讨论(0)
  • 2021-02-20 10:15

    You can use this code. Please change the CGRect according to your desire.

    - (void)drawRect:(CGRect)rect
    {
        CGContextRef context = UIGraphicsGetCurrentContext();
    
        CGRect topView = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height / 2);
        CGRect bottomView = CGRectMake(0, [UIScreen mainScreen].bounds.size.height / 2, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height / 2);
    
        UIColor * grayColor = [UIColor colorWithRed:230.0/255.0 green:230.0/255.0 blue:230.0/255.0 alpha:1.0];
    
        CGContextSetFillColorWithColor(context, grayColor.CGColor);
        CGContextFillRect(context, bottomView);
    
        CGContextSetFillColorWithColor(context, [UIColor yellowColor].CGColor);
        CGContextFillRect(context, topView);
    }
    

    The following link may help you more. http://www.raywenderlich.com/32925/core-graphics-tutorial-shadows-and-gloss

    0 讨论(0)
提交回复
热议问题