12

我希望 UIView 的底部(不是一半)与顶部的颜色不同。

我想知道是否应该创建一个 CGRect 然后为其着色?这是在正确的轨道上吗?

- (void)drawRect:(CGRect)rect { 

    CGRect aRect = CGRectMake(x, y, width, height);

    // Fill the rectangle with grey
    [[UIColor greyColor] setFill];
    UIRectFill( rect );
}
4

6 回答 6

10

是的,因为您已经覆盖了 drawRect 方法,所以可以这样做。

- (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 );

}

根据需要更改框架内的值。

于 2013-08-05T17:33:51.360 回答
4

在 Swift 5.1 和 iOS 13 中,您可以选择以下两种方式之一来解决您的问题。


#1。使用函数绘制并用子类中的实例填充指定CGRect的实例UIColorUIViewUIRectFill(_:)

UIKit提供了一个UIRectFill(_:)功能。UIRectFill(_:)有以下声明:

func UIRectFill(_ rect: CGRect)

用当前颜色填充指定的矩形。

以下 Playground 代码显示了如何使用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。使用's方法在子类中绘制和填充指定CGRect实例UIColorUIViewCGContextfill(_:)

CGContext有一个方法叫做fill(_:). fill(_:)有以下声明:

func fill(_ rect: CGRect)

使用当前图形状态下的填充颜色绘制包含在提供的矩形内的区域。

以下 Playground 代码显示了如何使用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
于 2017-08-21T12:47:12.817 回答
1

您还可以将 CALayer 作为子层添加到您的视图中。包括 CoreGraphics 和 QuartzCore 框架,并在您的 drawRect 方法中创建一个具有所需形状因子的 CGRect。使用 rect 实例化一个 CALayer 并使用 [self.layer addSublayer:theLayer] 将其添加到视图层。在添加之前使用 CALayer 的 -setBackgroundColor: 方法。

如果这是在 View Controller 而不是 View 子类中,请在 viewDidLoad 方法中执行完全相同的操作。

布莱恩

于 2013-08-05T17:56:48.510 回答
1

您可以使用此代码。请根据您的需要更改 CGRect。

- (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);
}

以下链接可能对您有更多帮助。 http://www.raywenderlich.com/32925/core-graphics-tutorial-shadows-and-gloss

于 2013-08-05T18:35:58.073 回答
0

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.

于 2013-08-05T17:47:12.957 回答
0

你可以做一个 CGRect 并剪裁一部分来填充。

但是为什么不尝试两个不同的 UIView 并排放置呢?

巴拉特

于 2013-08-05T17:31:26.977 回答