Set background color for only part of UIView

前端 未结 6 2680
生来不讨喜
生来不讨喜 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: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
    

提交回复
热议问题