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 right track?
- (void)drawRect:(CGRect)rect {
CGRect aRect = CGRectMake(x, y, width, height);
// Fill the rectangle with grey
[[UIColor greyColor] setFill];
UIRectFill( rect );
}
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.
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
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
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
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
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.
来源:https://stackoverflow.com/questions/18064055/set-background-color-for-only-part-of-uiview