问题
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 );
}
回答1:
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.
回答2:
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
回答3:
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
回答4:
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
回答5:
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
回答6:
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