1. 程式人生 > >IOS製作星星加分效果

IOS製作星星加分效果

製作原理:

  1. 使用xib繪製5個星星(圖片檢視),一個動態顯示分數label
  2. 計算出最大,小的X,和星星寬度,建立一個顯示總分數label
  3. 主要是手勢觸控時當觸控開始時控制如何顯示星星,當移動時控制如何顯示星星,當觸控結束時,給定動態顯示的分數
  4. 如何顯示星星:根據觸控點的X確定總分數,再讓根據總分數判斷呼叫顯示幾個星星的方法.

具體demo的程式碼實現:

xib圖:
這裡寫圖片描述

#import <UIKit/UIKit.h>
@interface HHFStarView : UIView
+(instancetype) starView;
@end
//
//  HHFStarView.m
// HHFStarDemo // // Created by mac on 16/8/11. // Copyright © 2016年 huang. All rights reserved. // #import "HHFStarView.h" #import "UIViewExt.h" #define kScreenHeight CGRectGetHeight([UIScreen mainScreen].bounds) #define kScreenWidth CGRectGetWidth([UIScreen mainScreen].bounds) /** *設定顏色的值 */ #define RGBCOLOR(r,g,b,_alpha) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:_alpha]
@interface HHFStarView() //5顆星星 @property (weak, nonatomic) IBOutlet UIImageView *firstStar; @property (weak, nonatomic) IBOutlet UIImageView *secondStar; @property (weak, nonatomic) IBOutlet UIImageView *threeStar; @property (weak, nonatomic) IBOutlet UIImageView *fourthStar; @property (weak, nonatomic
) IBOutlet UIImageView *fiveStar; //顯示分數 @property (weak, nonatomic) IBOutlet UILabel *scoreLabel; //動態顯示分數label @property(nonnull,strong) UILabel *label; //分數 @property(nonatomic,assign) NSInteger leveal; @end //最大的x值 static CGFloat maxX; //最小的x值 static CGFloat minX; //邊距 static const CGFloat margin = 8.0; //星星的寬度 static CGFloat everyWidth; @implementation HHFStarView //類方法 +(instancetype) starView{ HHFStarView *startView = [[[NSBundle mainBundle] loadNibNamed:@"HHFStarView" owner:self options:nil] lastObject]; startView.frame = CGRectMake(0, kScreenHeight-200, kScreenWidth, 200); //初始化maxX,minX,everyWidth [startView initValues]; //建立動態顯示分數的label [startView createUI]; return startView; } //初始化maxX,minX,everyWidth - (void) initValues { maxX = self.fiveStar.right + margin/2; minX = self.firstStar.left - margin/2; everyWidth = (self.firstStar.width + margin) / 2; } //建立動態顯示分數的label - (void) createUI { _label = [[UILabel alloc] init]; _label.bounds = CGRectMake(0, 0, 40, 20); _label.textAlignment = NSTextAlignmentCenter; _label.font = [UIFont systemFontOfSize:14]; _label.textColor = [UIColor whiteColor]; [self addSubview:_label]; } //設定單個星星的圖片 - (UIImage *) setImagesWithName:(NSString *) imgName { NSString *path = [[NSBundle mainBundle] pathForResource:imgName ofType:nil]; UIImage *image = [UIImage imageWithContentsOfFile:path]; return image; } //手勢觸控,當觸控開始時控制如何顯示星星 - (void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self setImagesWithTouchs:touches]; } //手勢觸控,當移動時控制如何顯示星星 - (void) touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self setImagesWithTouchs:touches]; } //當觸控結束時,給定動態顯示的分數 - (void) touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { _label.text = [NSString stringWithFormat:@"%d分",(int)_leveal]; //若_leveal的值是不為偶數就減1 NSInteger n = _leveal; if (!(n%2)) { n --; } //動態分數label會隨著顯示幾個星星改變中心點 _label.center = CGPointMake(n*everyWidth+minX, _fiveStar.top-20); _label.alpha = 1; [UIView animateWithDuration:1 animations:^{ //動態消失 _label.alpha = 0; //動態上升星星 _label.center = CGPointMake(n*everyWidth+minX, _fiveStar.top-60); }]; } - (void) setImagesWithTouchs:(NSSet *)touches { UITouch *touch = [touches anyObject]; CGFloat touchX = [touch locationInView:self].x; CGFloat touchY = [touch locationInView:self].y; //固定觸控範圍,若以下兩個條件滿足就什麼也不做 if (touchY < self.fiveStar.top - 10 || touchY > self.fiveStar.bottom +10) { return; } if (touchX < minX || touchX > maxX) { return; } //確定分數 CGFloat dis = (touchX - minX) / everyWidth; [self setFiveKongImg]; //分數 _leveal = (NSInteger)dis + 1; if (dis >= 10.0) { _leveal = 10; } //根據分數,顯示幾個星星 switch (_leveal) { case 1: [self setFistBanImg]; break; case 2: [self setOneZhengImg]; break; case 3: [self setSecondBanImg]; break; case 4: [self setTwoZhengImg]; break; case 5: [self setThreeBanImg]; break; case 6: [self setThreeZhengImg]; break; case 7: [self setFourthBanImg]; break; case 8: [self setFourZhengImg]; break; case 9: [self setFifthBanImg]; break; case 10: [self setFiveZhengImg]; break; default: break; } //顯示共幾分 _scoreLabel.text = [NSString stringWithFormat:@"共%d分",(int)_leveal]; } //設定原始5個空心星星 - (void) setFiveKongImg { _firstStar.image = [self setImagesWithName:@"[email protected]"]; _secondStar.image = [self setImagesWithName:@"[email protected]"]; _threeStar.image = [self setImagesWithName:@"[email protected]"]; _fourthStar.image = [self setImagesWithName:@"[email protected]"]; _fiveStar.image = [self setImagesWithName:@"[email protected]"]; } //設定圓心星星 - (void) setOneZhengImg { _firstStar.image = [self setImagesWithName:@"[email protected]"]; } - (void) setTwoZhengImg { [self setOneZhengImg]; _secondStar.image = [self setImagesWithName:@"[email protected]"]; } - (void) setThreeZhengImg { [self setTwoZhengImg]; _threeStar.image = [self setImagesWithName:@"[email protected]"]; } - (void) setFourZhengImg { [self setThreeZhengImg]; _fourthStar.image = [self setImagesWithName:@"[email protected]"]; } - (void) setFiveZhengImg { [self setFourZhengImg]; _fiveStar.image = [self setImagesWithName:@"[email protected]"]; } //設定圓心加空心的星星 - (void) setFistBanImg { _firstStar.image = [self setImagesWithName:@"[email protected]"]; } - (void) setSecondBanImg { [self setOneZhengImg]; _secondStar.image = [self setImagesWithName:@"[email protected]"]; } - (void) setThreeBanImg { [self setTwoZhengImg]; _threeStar.image = [self setImagesWithName:@"[email protected]"]; } - (void) setFourthBanImg { [self setThreeZhengImg]; _fourthStar.image = [self setImagesWithName:@"[email protected]"]; } - (void) setFifthBanImg { [self setFourZhengImg]; _fiveStar.image = [self setImagesWithName:@"[email protected]"]; } @end
#import "ViewController.h"
#import "HHFStarView.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    HHFStarView *startView = [HHFStarView starView];
    [self.view addSubview:startView];
}

@end

執行效果:
這裡寫圖片描述

相關推薦

IOS製作星星效果

製作原理: 使用xib繪製5個星星(圖片檢視),一個動態顯示分數label 計算出最大,小的X,和星星寬度,建立一個顯示總分數label 主要是手勢觸控時當觸控開始時控制如何顯示星星,當移動時控制如何顯示星星,當觸控結束時,給定動態顯示的分數 如何顯示星星:

iOS--CollectionView添類似TableView的TableViewHeaderView 和 SectionHeader 的置頂懸停效果

inter 頂部 edge .net 但是 con pan mint ont 1.懸停效果    http://blog.csdn.net/liangyc0129/article/details/51781722   主要參考此博客,使用 JHHeaderFlowLayou

Focusky常見問題解答 | 推薦幾款能為演示的文字進入動畫效果

為文字新增進入動畫效果可以讓你的演示更加生動,首先我們可以看一下Focusky(也稱為“FS軟體”)提供的幾種文字進入動畫效果圖: 1.文字跳入 這一效果自動放大文字進入,給幻燈片增加了第三個維度,提高了排版的靈活性。 【▲圖1】 開啟動畫編輯器,選中字型,選擇新增動畫, 然後在進

IOS 簡單的 動畫

使用 shapeLayer 當動畫層  其實以前有寫過 類似的了 self.pregress = [[CAShapeLayer alloc]init]; _pregress.frame = CGRectMake(15,18, 64,64);

iOS-68-星星評價、顯示小數點星星評價效果(附demo)

1、上效果圖: 2、 第一個是顯示的7.2分的評分 第二個可以點選選擇評分 3、主要程式碼: - (void)creatStarView{ UIImage *gray = [UIImage imageNamed:@"starGrey"]

iOS 類知乎”頁”效果的實現?

我們先看張gif圖看一下效果(LICEcap錄製的有點卡, 湊合看) 好像還是卡, 懟個視訊演示連結吧: https://m.weibo.cn/1990517135/4398431764047996 我們先來分析一下頁面結構, 然後分析具體動畫實現.   頁面結構: 可以將當

用Physijs在場景中添物理效果

角度 彌補 relax 任務 blog 柱狀圖 要約 back borde 1.創建可用Physijs的基本Three.js場景 創建一個可用Physijs的Three.js場景非常簡單,只要幾個步驟即可。首先我們要包含正確的文件, 需要引入physi.js文件。

Qt 系統托盤(hover效果

界面 lose bytearray blog ndb pex 打開 tip tin 最近項目需要添加系統托盤,本來Qt的QSystemTrayIcon可以實現的,但是要求要添加hover效果,並顯示未讀消息(就和qq的托盤差不多,移動上去顯示未讀列表),加了這個要求QSys

非交互式添

uid ret sof microsoft art mini mic phy operation 非交互式添加分區 方法一 添加/deb/sdb 下的分區,其實位置為1到1000M,第二個分區位置為1001至3000M,位置千萬不能指定錯誤 parted /dev

Menu菜單屬性添割線與隱藏多余的割線

ref archive arc 手動 鏈接 tomat mage logs pan MyMenu.AutoLineReduction := maAutomatic; {默認會自動隱藏多余的分割線} //MyMenu.AutoLineReduction := maM

iOS 實現簡單的毛玻璃效果

rec 毛玻璃效果 實現簡單 ges 導航欄 view設置 with 技術 簡單 最近在整理導航欄的漸隱漸現效果,整理過程中偶然學會了圖片的毛玻璃效果實現,很簡單,不多說了,先上圖看看效果對比, 這是原圖, 這是加了效果後的,創建圖片的代碼就不上了,下面看下添加效果的代碼

【luogu1040】二叉樹

num sign 中序 計算方法 個數 整數 一個 -m 輸入輸出 題目描述 設一個n個節點的二叉樹tree的中序遍歷為(1,2,3,…,n),其中數字1,2,3,…,n為節點編號。每個節點都有一個分數(均為正整數),記第i個節點的分數為di,tree及它的每個子樹都有一個

使用css3實現小菊花效果

常見 ani frame 嘗試 linear key 利用 del 做成 使用css3實現小菊花加載效果   最常見的就是我們用到的加載動畫。加載動畫的效果處理的好,會給頁面帶來畫龍點睛的作用,而使用戶願意去等待。而頁面中最常用的做法是把動畫做成gif格式,當做背景圖或是i

iOS WKWebView添網頁載進度條(轉)

err -i original 網頁 star span rop remove ram 一、效果展示 WKWebProgressViewDemo.gif 二、主要步驟 1.添加UIProgressView屬性 @property (nonato

web登陸,增刪改頁。

margin set 分頁代碼 temp con scrip 訪問 chang borde 這段時間做了登陸頁面和對數據庫的增刪改。傳值用了cokkies. 首先是登陸頁面: <%@ Page Language="C#" AutoEventWireup="true"

019 添區功能 - bos

save 小明 基礎 template n) dao 前端 service nand 一、基礎調整 1.刪除subarea.jsp中新增窗口的分區編碼一行 2.修改Subarea.hbm.xml,主鍵生成策略為uuid 二、easyUI - combobox下拉框的使用

【基礎練習】【區間DP】codevs1090 二叉樹題解

border style script 全部 靈魂 noip 初始 mar 出現 2003 NOIP TG 題目描寫敘述 Description 設一個n個節點的二叉樹tree的中序遍歷為(l,2,3,…,n),當中數字1,2,3,…,n為節點編

cogs 106. [NOIP2003] 二叉樹(區間DP)

cstring def n) -- efi 其中 spa times oid 106. [NOIP2003] 加分二叉樹 ★☆ 輸入文件:jfecs.in 輸出文件:jfecs.out 簡單對比時間限制:1 s 內存限制:128 MB 【問題描述】 設

二叉樹

前序遍歷 str 結果 只有一個 long ont ace 葉子 描述 題目描述 設一個n個節點的二叉樹tree的中序遍歷為(1,2,3,…,n),其中數字1,2,3,…,n為節點編號。每個節點都有一個分數(均為正整數),記第i個節點的分數為di,tree及它的每個子樹都有

iOS 利用SDWebImage載webp圖片

運行 build img svn images span scratch ges 技術分享 首先下載 libwebp http://www.linuxfromscratch.org/blfs/view/svn/general/libwebp.html 下載完成後解壓並運行