iOS開發:如何正確繪製1像素的線

2021-02-24 二進位小鎮

//

//  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

相關焦點

  • 每日一題——機動法繪製影響線
    【解析】關於連續梁的影響線,一般採用機動法繪製,比靜力法簡單、便捷,但如果不摸透位移變化規律,容易畫錯,我們分別來看下:但是A左端為大地,與誰平行、該如何繪製AB段呢?這是個問題,其實也簡單,只要記住一個小技巧:把大地當做平的,因此AB段必定是水平的,且向上位移1,AB段量值為1;C處不動,直線一連即得BCD段;注意DE段平行於BCD段;另EFG為靜定部分,將保持不動。根據幾何關係即得QA影響線:
  • 玩轉地球: 如何利用SAS繪製現代化地圖(附代碼)
    地理空間數據結合其他業務數據如何被分析利用,以及如何在分析中可視化呈現一直是現代化分析平臺的一個重要方向。一方面各種地圖服務越來越多地集成到應用中,成為應用增強交互的組成部分(比如「附近的服務/人」,甚至連支付包紅包都需要呈現各種方位關係,來增強樂趣),另一方面在分析行業,如何能夠高效方便地繪製各種地圖成為一種基本需求。
  • 像素畫新手教程:極簡像素畫角色分析
    摘要:像素畫新手教程:極簡像素畫角色分析關鍵詞
  • 像素畫新手教程:如何畫發光物體?
    摘要:像素畫新手教程:如何畫發光物體?
  • Nature:從全球天然林再生中繪製碳積累潛力圖
    Cook-Patton1.The Nature Conservancy, Arlington, VA, USA.2.Smithsonian Environmental Research Center, Edgewater, MD, USA.遏制全球變暖必須減少溫室氣體排放並捕獲大氣中多餘的二氧化碳。
  • 我的世界:高手親自設計MC像素畫,這屆事業粉為官方操碎了心
    「《我的世界》需要一些新的像素畫!」「是時候給Minecraft設計畫了!」·網友@S5Z7嫌棄官方進度慢,親自繪製新的像素畫,作品在Reddit獲得幾萬點讚,連Dinnerbone都說「I love them」。
  • 數據可視化系列:手把手教你繪製帶誤差線的條形圖
    條形圖可以用於展示數據不同分類下的均值、中位數、標準差和置信區間等,Excel可以實現,但對於帶誤差線的條形圖而言
  • 像素畫高級教程:加血道具肉的畫法
    :像素畫,遊戲開發,道具,肉撰文&編輯:三二 教你畫像素畫首發 | 公眾號 pixelart本文共423個字,閱讀大約需要1分鐘。像素畫主題本系列教程使用軟體為Aseprite,畫布尺寸均為32X32像素,這是非常適合新手練習的像素畫尺寸,同時也適合轉畫為手繪像素畫。你可以用這個尺寸創作大量適合手繪的像素畫圖案。今天的練習主題是肉。
  • 像素畫高級教程:蛋糕的畫法
    摘要:像素畫高級教程:蛋糕的畫法關鍵詞:蛋糕
  • 福利:如何提高照片像素
    如何提高照片像素?相信很多人都想過這個問題,不過討論到最後一致的答案就是……這玩意兒只能在電影裡見到。
  • 蘋果越獄工具 | iOS 14.3越獄工具更新
    長期更新預告:日常 軟體測評、網站測評,神器測評, 資源測評,稀缺資源    1.Android面具&框架&免root太極、轉生、黃鳥教程2.win黑蘋果雙系統教程(OC&Clover |Catalina&Bigsur)3.黑蘋果&
  • 百年巨獻:艾倫人工智慧研究所 350 頁腦圖譜每英寸像素 1 微米
    現在,艾倫人工智慧研究所出版了一部 350 頁的實體書 「Allen Human Brain Reference Atlas」,同時還附有網上的公開資料庫。Allen Institute for Brain Science 的資料庫以細胞水平展示腦結構,解析度達到每英寸像素 1 微米。
  • 深度解析:人眼到底等於多少像素
    之後就有不少人紛紛拿出了自己的算法,得出的結論少的有500萬,多的有100億,當然還有一個5.76億這麼一個看起來超級標準的數字。不過今天筆者也想來和大家討論一下,到底人眼有多少像素。2、理論文獻多又多 我們來看看理論文獻多又多 我們來看看既然這是一篇出發點還是希望是嚴謹的文章,我們肯定首先要做的事情是來尋找一下目前已有的資料進行考證,關於人眼生理結構的資料可以說非常完善了,這裡邊筆者大概給大家提供以下幾個點出來: No.1 人眼能夠解析度的最小細節折合0.59角分 No.2
  • 國外開發指南:如何製作洛克人一樣的2D平臺動作遊戲?
    在這種遊戲中,玩家將很少-如果有的話–沿對角線進行移動,如果一定要這麼做的話,沿對角線進行移動可以分解成兩個單獨的步驟。同樣的,他一次將只可能移動一個瓦片的距離,但是如果需要的話,多個瓦片的一次移動可以通過多次一個瓦片的移動來實現(在《Flashback》中,你將每次移動2個瓦片)。
  • 像素畫高級教程:角色服裝設計
    摘要:像素畫高級教程:角色服裝設計關鍵詞:像素畫,高級教程,遊戲角色,服裝設計
  • TeraBox像素畫教程:滑翔機動畫
    摘要:TeraBox像素畫教程:滑翔機動畫
  • 像素畫基礎:抖動詳細介紹
    抖動,英文Dithering,是通過混合2種不同顏色的像素方塊,獲得更多顏色的技巧。抖動主要在早期像素畫中大量使用,因為早期像素畫受計算機硬體限制,僅支持非常少的顏色,當時的像素畫家發明了抖動來獲得更多的顏色漸變。
  • 建築線上直播課:如何有效利用建築平立剖圖
    在建築、景觀設計中,設計師們為了徵服甲方爸爸,往往拿出各種狂拽炫酷高大上的效果圖,但是他們卻忽視了對平立剖圖紙的繪製。外行看熱鬧,大多重視效果圖;內行看門道,看的就是平立剖,因為平立剖能直觀地表現空間關係。只是為了畫技術圖而畫技術圖就夠了嗎?
  • 245.Office技巧:如何在PPT中繪製弧形效果?
    QQ群的小夥伴積極的提問保持出一種良好的狀態,大家都非常專業認真的解答問題,這種相互幫助的氣氛,讓牛閃閃也十分的欣慰。畢竟幫助別人就是提升自己Office最好的手段之一。問題:如何在PPT中繪製弧形效果?解答:利用PPT的圖形堆疊「障眼法」搞定。 搞定這個弧形的效果其實非常簡單,用兩個橢圓堆疊來搞定。具體操作如下:在頁面中插入橢圓。(下圖 1 處)
  • 網友問答:勇者鬥惡龍像素畫美術風格是怎麼進化的?
    網友問答:勇者鬥惡龍像素畫美術風格是怎麼進化的?