iOS如何簡單實現繪製愛心?

来源:https://www.cnblogs.com/wgb1234/archive/2020/03/22/12544295.html

靈感來源於前端CSS畫紅心的原理 "參考" 上代碼 簡單調用如下: ...


靈感來源於前端CSS畫紅心的原理 參考

示例

上代碼


#import <UIKit/UIKit.h>
/**
    靈感來自於前端CSS畫紅心的原理: 一個正方形 + 兩個圓 + 整體旋轉一定的角度
*/

NS_ASSUME_NONNULL_BEGIN
IB_DESIGNABLE
@interface WGBHeartView : UIView
//❤心有多大?
@property (nonatomic,assign) IBInspectable CGFloat heartSize;
//❤心的顏色?
@property (nonatomic,strong) IBInspectable UIColor *heartColor;
@end
NS_ASSUME_NONNULL_END


#import "WGBHeartView.h"

@interface WGBHeartView()

@property (nonatomic,strong) UIView *bottomView;
@property (nonatomic,strong) UIView *leftView;
@property (nonatomic,strong) UIView *rightView;

@end

@implementation WGBHeartView

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self initConfig];
    }
    return self;
}

- (instancetype)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self) {
        [self initConfig];
    }
    return self;
}

- (void)initConfig{
        //預設值
    self.heartSize = 150.0;
    self.heartColor = [UIColor redColor];
    [self addSubview: self.bottomView];
    [self addSubview: self.leftView];
    [self addSubview: self.rightView];
    //提前旋轉45度
    self.transform = CGAffineTransformMakeRotation(M_PI_4);
}

//去除設置背景色 
- (void)setBackgroundColor:(UIColor *)backgroundColor{
    backgroundColor = [UIColor clearColor];
    [super setBackgroundColor:backgroundColor];
}

- (void)setHeartSize:(CGFloat)heartSize{
    _heartSize = heartSize;
    CGFloat partSize = heartSize/3.0;
    self.bottomView.frame = CGRectMake(partSize, partSize, partSize*2 , partSize*2);
    self.leftView.frame = CGRectMake(0, partSize, partSize*2 , partSize*2);
    self.rightView.frame = CGRectMake(partSize, 0, partSize*2 , partSize*2);
    
    self.leftView.layer.cornerRadius = partSize;
    self.rightView.layer.cornerRadius = partSize;
}

- (void)setHeartColor:(UIColor *)heartColor{
    _heartColor = heartColor;
    self.bottomView.backgroundColor = heartColor;
    self.leftView.backgroundColor = heartColor;
    self.rightView.backgroundColor = heartColor;
}

    ///MARK:- lazy load
- (UIView *)bottomView{
    if (!_bottomView) {
        _bottomView = [[UIView alloc] initWithFrame:CGRectZero];
        [self addSubview:_bottomView];
    }
    return _bottomView;
}
- (UIView *)leftView{
    if (!_leftView) {
        _leftView = [[UIView alloc] initWithFrame:CGRectZero];
        [self addSubview:_leftView];
    }
    return _leftView;
}

- (UIView *)rightView{
    if (!_rightView) {
        _rightView = [[UIView alloc] initWithFrame:CGRectZero];
        [self addSubview:_rightView];
    }
    return _rightView;
}

@end

IB

簡單調用如下:

    WGBHeartView *heartView = [[WGBHeartView alloc] initWithFrame:CGRectMake(100, 100, 100 , 100)];
    heartView.heartColor = [UIColor blackColor];//預設顏色是紅色
    heartView.heartSize = 100; //這個尺寸最好是設置與視圖寬高一致 生成的愛心❤️比較規則
    [self.view addSubview: heartView];
    
    for (NSInteger i = 0; i < 6; i += 1) {
        CGFloat heartWH = 50.0f;
        CGFloat margin = 15.0f;
        WGBHeartView *heartItemView = [[WGBHeartView alloc] initWithFrame:CGRectMake(20 + (heartWH+margin)*i,   250, heartWH , heartWH)];
        heartItemView.heartColor = [UIColor colorWithRed:arc4random()%256/255.0f green:arc4random()%256/255.0f  blue:arc4random()%256/255.0f alpha:1.0f];
        heartItemView.heartSize = heartWH;
        [self.view addSubview: heartItemView];
    }


您的分享是我們最大的動力!

更多相關文章
  • RDD介紹 1.RDD概念以及特性 RDD(Resilient Distributed Dataset)叫做彈性分散式數據集,是Spark中最基本的數據抽象,它代表一個不可變、可分區、裡面的元素可並行計算的集合。RDD具有數據流模型的特點:自動容錯、位置感知性調度和可伸縮性。RDD允許用戶在執行多個 ...
  • 使用SpringBoot初始化項目,集成測試遠程連接的Redis服務,並記錄了五大基本數據類型,在jedis中的體現方式。 ...
  • 對於資料庫,優化查詢的方法 1.使用索引 使用索引時,應儘量避免全表掃描,首先應考慮在 where 及 order by ,group by 涉及的列上建立索引。 2.優化SQL語句 1)分析查詢語句:通過對查詢語句的分析,可以瞭解查詢語句執行情況,找出查詢語句執行的瓶頸,從而優化查詢語句。 通過e ...
  • 帶著問題去思考,大家好! 前幾天瞭解到EF Core的開發模式:DB First(資料庫優先),Model First(模式優先),Code First(代碼優先)。 我所接觸的大多是DB First。如果大家瞭解的話,有些開源後臺項目,基本都會有後兩者,因為方便大家更快的去使用部署起來後臺。 在建 ...
  • 本文基於mysql 8.0,官方手冊: ,同時參考了 "mysql鎖機制詳解" 主要內容如下: 1. 共用鎖和排他鎖(Shared and Exclusive Locks) 2. 意向鎖(Intention Locks) 3. 記錄鎖(Record Locks) 4. 間隙鎖(Gap Locks) ...
  • 關於刪庫跑路的事故現在已經屢見不鮮了,數據備份的必要性是企業數據管理極其重要的一項工作。關於數據備份、恢復也有很多場景及方法,本系列也會將主要的幾種工具通過案例進行演示。 本系列將從邏輯備份及恢復開始講起,邏輯備份的工具主要有mysqldump/mydumper等其中mydumper可以指定多線程工 ...
  • 很多的小伙伴,經常會有這樣的困惑,我看了很多技術的學習文檔、書籍、甚至視頻,我想動手實踐,於是我打開了GitHub,想找個開源項目,進行學習,獲取項目實戰經驗。這個時候很多小伙伴就會面臨這樣的問題:“我不會搜啊,我該怎麼找呀?”,最終只能放棄。相信看完這篇文章,你就可以學會如何精準地在GitHub搜 ...
  • 慕課網-2019年android工程師 攻城獅 鏈接:https://pan.baidu.com/s/1HgKR7dPbZrJbm4LUEMG6rQ 提取碼:ge2a 複製這段內容後打開百度網盤手機App,操作更方便哦 微雲: 鏈接:https://share.weiyun.com/5PsCNB9 ...
一周排行
  • 前幾天發佈了 "抄抄《CSS 故障藝術》的動畫" 這篇文章,在這篇文章里介紹瞭如何使用Win2D繪製文字然後配合BlendEffect製作故障藝術的動畫。本來打算就這樣收手不玩這個動畫了,但後來又發現性能不符合理想。明明只是做做Resize動畫和用BlendEffect混合,為什麼性能會這麼差呢? ...
  • 控制條控制項: progressBar 不能按照你程式的進程自動變化,需認為計算,調整變化量 private void progressBar1_Click(object sender, EventArgs e) { this.progressBar1.Maximum = 100;//設置進度條最大長 ...
  • 首先創建一個asp.net core web應用程式 第二步 目前官方預置了7種模板項目供我們選擇。從中我們可以看出,既有我們熟悉的MVC、WebAPI,又新添加了Razor Page,以及結合比較流行的Angular、React前端框架的模板項目。 空項目模板 Program.cs using S ...
  • 對閉包的理解 1.對於成員變數和局部變數:成員變數就是方法外部,類的內部定義的變數;局部變數就是方法或語句塊內部定義的變數。局部變數必須初始化。 形式參數是局部變數,局部變數的數據存在於棧記憶體中。棧記憶體中的局部變數隨著方法的消失而消失。成員變數存儲在堆中的對象裡面,由垃圾回收器負責回收。 成員變數它 ...
  • Xamarin.Forms讀取並展示Android和iOS通訊錄 TerminalMACS客戶端 本文同步更新地址: https://dotnet9.com/11520.html https://terminalmacs.com/861.html 閱讀導航: 一、功能說明 二、代碼實現 三、源碼獲取 ...
  • 做下對文件複製操作相關的筆記: /// <summary> /// 文件幫助類 /// </summary> public class FileHelper { /// <summary> /// 複製一個目錄下所有文件到一個新目錄下 /// </summary> /// <param name=" ...
  • 前言 有一個東西叫做鴨子類型,所謂鴨子類型就是,只要一個東西表現得像鴨子那麼就能推出這玩意就是鴨子。 C 裡面其實也暗藏了很多類似鴨子類型的東西,但是很多開發者並不知道,因此也就沒法好好利用這些東西,那麼今天我細數一下這些藏在編譯器中的細節。 不是只有 和 才能 在 C 中編寫非同步代碼的時候,我們經 ...
  • [toc] 1.應用背景 底端設備有大量網路報文(位元組數組):心跳報文,數據採集報文,告警報文上報。需要有對應的報文結構去解析這些位元組流數據。 2.結構體解析 由此,我第一點就想到了用結構體去解析。原因有以下兩點: 2.1.結構體存在棧中 類屬於引用類型,存在堆中;結構體屬於值類型,存在棧中,在一個 ...
  • 《深入淺出 C#》 (第3版) [作者] (美) Andrew Stellman (美) Jennifer Greene[譯者] (中) 徐陽 丁小峰 等譯[出版] 中國電力出版社[版次] 2016年08月 第1版[印次] 2018年04月 第4次 印刷[定價] 148.00元 【引子】 要學習編程 ...
  • 記錄使用對象初始值設定項初始化對象。 using System; using System.Collections.Generic; namespace ConsoleApp2 { class Program { static void Main(string[] args) { // 使用構造函數 ...
x