Created
August 1, 2016 14:57
-
-
Save fhefh2015/ecfea318541cd5e2f35954a5074942e6 to your computer and use it in GitHub Desktop.
正确的绘制Grid线条 1px细线
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// SvGridView.h | |
// SvSinglePixel | |
// | |
// Created by xiaoyong.cxy on 6/23/15. | |
// Copyright (c) 2015 smileEvday. All rights reserved. | |
// | |
#import <UIKit/UIKit.h> | |
@interface SvGridView : UIView | |
/** | |
* @brief 网格间距,默认30 | |
*/ | |
@property (nonatomic, assign) CGFloat gridSpacing; | |
/** | |
* @brief 网格线宽度,默认为1 pixel (1.0f / [UIScreen mainScreen].scale) | |
*/ | |
@property (nonatomic, assign) CGFloat gridLineWidth; | |
/** | |
* @brief 网格颜色,默认蓝色 | |
*/ | |
@property (nonatomic, strong) UIColor *gridColor; | |
@end | |
// | |
// SvGridView.m | |
// SvSinglePixel | |
// | |
// Created by xiaoyong.cxy on 6/23/15. | |
// Copyright (c) 2015 smileEvday. All rights reserved. | |
// | |
#import "SvGridView.h" | |
#define SINGLE_LINE_WIDTH (1 / [UIScreen mainScreen].scale) | |
#define SINGLE_LINE_ADJUST_OFFSET ((1 / [UIScreen mainScreen].scale) / 2) | |
@implementation SvGridView | |
@synthesize gridColor = _gridColor; | |
@synthesize gridSpacing = _gridSpacing; | |
- (instancetype)initWithFrame:(CGRect)frame | |
{ | |
self = [super initWithFrame:frame]; | |
if (self) { | |
self.backgroundColor = [UIColor clearColor]; | |
_gridColor = [UIColor blueColor]; | |
_gridLineWidth = SINGLE_LINE_WIDTH; | |
_gridSpacing = 30; | |
} | |
return self; | |
} | |
- (void)setGridColor:(UIColor *)gridColor | |
{ | |
_gridColor = gridColor; | |
[self setNeedsDisplay]; | |
} | |
- (void)setGridSpacing:(CGFloat)gridSpacing | |
{ | |
_gridSpacing = gridSpacing; | |
[self setNeedsDisplay]; | |
} | |
- (void)setGridLineWidth:(CGFloat)gridLineWidth | |
{ | |
_gridLineWidth = gridLineWidth; | |
[self setNeedsDisplay]; | |
} | |
// Only override drawRect: if you perform custom drawing. | |
// An empty implementation adversely affects performance during animation. | |
- (void)drawRect:(CGRect)rect | |
{ | |
CGContextRef context = UIGraphicsGetCurrentContext(); | |
CGContextBeginPath(context); | |
CGFloat lineMargin = self.gridSpacing; | |
/** | |
* https://developer.apple.com/library/ios/documentation/2DDrawing/Conceptual/DrawingPrintingiOS/GraphicsDrawingOverview/GraphicsDrawingOverview.html | |
* 仅当要绘制的线宽为奇数像素时,绘制位置需要调整 | |
*/ | |
CGFloat pixelAdjustOffset = 0; | |
if (((int)(self.gridLineWidth * [UIScreen mainScreen].scale) + 1) % 2 == 0) { | |
pixelAdjustOffset = SINGLE_LINE_ADJUST_OFFSET; | |
} | |
CGFloat xPos = lineMargin - pixelAdjustOffset; | |
CGFloat yPos = lineMargin - pixelAdjustOffset; | |
while (xPos < self.bounds.size.width) { | |
CGContextMoveToPoint(context, xPos, 0); | |
CGContextAddLineToPoint(context, xPos, self.bounds.size.height); | |
xPos += lineMargin; | |
} | |
while (yPos < self.bounds.size.height) { | |
CGContextMoveToPoint(context, 0, yPos); | |
CGContextAddLineToPoint(context, self.bounds.size.width, yPos); | |
yPos += lineMargin; | |
} | |
CGContextSetLineWidth(context, self.gridLineWidth); | |
CGContextSetStrokeColorWithColor(context, self.gridColor.CGColor); | |
CGContextStrokePath(context); | |
} | |
@end | |
//使用方法如下: | |
SvGridView *gridView = [[SvGridView alloc] initWithFrame:self.view.bounds]; | |
gridView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; | |
gridView.alpha = 0.6; | |
gridView.gridColor = [UIColor greenColor]; | |
[self.view addSubview:gridView]; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment