1. 程式人生 > >iOS:練習題中如何用技術去實現一個連線題

iOS:練習題中如何用技術去實現一個連線題

//
//  LianXianComponentsView.m
//  LianxianDemo
//
//  Created by 夏遠全 on 2018/2/6.
//  Copyright © 2018年 beijing. All rights reserved.
//

#import "LianXianComponentsView.h"
#import "LianxianDrawView.h"
#import "LianXianHeader.h"

@interface LianXianComponentsView() {
    NSMutableArray *_leftBtns;
    NSMutableArray 
*_rightBtns; UIButton *currentLeftBtn; CGFloat borderWith; } @end @implementation LianXianComponentsView //對進行重寫,以便在檢視初始化的時候建立並設定自定義的Context - (id)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { [self setupDefalutValue]; } return self; }
//設定預設值 - (void)setupDefalutValue{ self.backgroundColor = [UIColor clearColor]; borderWith = 2.5; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(restStatus:) name:kClearAllLineNotification object:nil]; } //接收模型 -(void)setLianxianModel:(LianXianModel *)lianxianModel{ _lianxianModel
= lianxianModel; [self setupLianXianUnit]; if (lianxianModel && lianxianModel.relationships.count>0) { [self showLianXianResult]; } else{ [self listClickLeftButton]; } } //繪製連線選項 - (void)setupLianXianUnit{ _leftBtns = [[NSMutableArray array] init]; _rightBtns = [[NSMutableArray array] init]; CGFloat kWidth = self.frame.size.width; CGFloat kHeight = self.frame.size.height; CGFloat LY = (kHeight-(BHeight+Lpadding)*(self.lianxianModel.questions.count-1) - BHeight)/2; CGFloat RY = (kHeight-(BHeight+Rpadding)*(self.lianxianModel.options.count-1) - BHeight)/2; for (NSInteger i =0; i < self.lianxianModel.questions.count; i++) { UIButton *btn = [self createButtonWithFrame:CGRectMake(margin, LY+(BHeight+Lpadding)*i, BWidth, BHeight) title:[NSString stringWithFormat:@"%@",self.lianxianModel.questions[i]] tag:i]; [self addSubview:btn]; [_leftBtns addObject:btn]; } for (NSInteger i =0; i< self.lianxianModel.options.count; i++) { UIButton *btn = [self createButtonWithFrame:CGRectMake(kWidth-margin-BWidth, RY+(BHeight+Rpadding)*i, BWidth, BHeight) title:[NSString stringWithFormat:@"%@",self.lianxianModel.options[i]] tag:i]; [self addSubview:btn]; [_rightBtns addObject:btn]; } } -(UIButton *)createButtonWithFrame:(CGRect)frame title:(NSString *)title tag:(NSInteger)tag{ UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; btn.frame = frame; btn.layer.cornerRadius = 5.0; btn.layer.borderColor = [UIColor lightGrayColor].CGColor; btn.layer.borderWidth = borderWith; btn.layer.masksToBounds = YES; btn.tag = tag; [btn setBackgroundImage:[self imageWithColor:[UIColor whiteColor]] forState:UIControlStateNormal]; [btn setBackgroundImage:[self imageWithColor:[UIColor colorWithRed:138/255.0 green:193/255.0 blue:211/255.0 alpha:1]] forState:UIControlStateHighlighted]; [btn setBackgroundImage:[self imageWithColor:[UIColor colorWithRed:138/255.0 green:193/255.0 blue:211/255.0 alpha:1]] forState:UIControlStateSelected]; [btn addTarget:self action:@selector(tapBtn:) forControlEvents:UIControlEventTouchUpInside]; [btn setTitle:title forState:UIControlStateNormal]; [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; return btn; } - (UIImage *)imageWithColor:(UIColor *)color { CGFloat imageW = 20; CGFloat imageH = 20; UIGraphicsBeginImageContextWithOptions(CGSizeMake(imageW, imageH), NO, 0.0); [color set]; UIRectFill(CGRectMake(0, 0, imageW, imageH)); UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return image; } -(void)tapBtn:(UIButton *)btn{ //判斷左邊按鈕是否處於選擇狀態,只有首先左邊處於此狀態下,右邊的按鈕點選才能進行連線操作(當前僅支援單向連線) if ([_rightBtns containsObject:btn]) { BOOL isLeftBtnSelected = NO; for (UIButton *leftBtn in _leftBtns) { if (leftBtn.selected) { isLeftBtnSelected = YES; break; } } if (!isLeftBtnSelected) { return; } } if ([_leftBtns containsObject:btn]) { //設定連線起點 currentLeftBtn.selected = NO; currentLeftBtn.layer.borderColor = [UIColor lightGrayColor].CGColor; btn.selected = YES; currentLeftBtn = btn; currentLeftBtn.layer.borderColor = [UIColor colorWithRed:32/255.0 green:199/255.0 blue:251/255.0 alpha:1].CGColor; //設定終點按鈕可以選中狀態 for (UIButton *rightBtn in _rightBtns) { rightBtn.layer.borderColor = [UIColor colorWithRed:32/255.0 green:199/255.0 blue:251/255.0 alpha:1].CGColor; } //傳送起點通知 [[NSNotificationCenter defaultCenter] postNotificationName:kBeginPositionNotification object:[NSValue valueWithCGRect:btn.frame]]; } if ([_rightBtns containsObject:btn]) { for (UIButton *leftBtn in _leftBtns) { if (leftBtn.selected) { //傳送終點通知 [[NSNotificationCenter defaultCenter] postNotificationName:kEndPositionNotification object:[NSValue valueWithCGRect:btn.frame]]; //自動設定起始選擇按鈕 [self listClickLeftButton]; break; } } } } //自動設定起始選擇按鈕 - (void)listClickLeftButton{ if (!currentLeftBtn) { [self tapBtn:_leftBtns[0]]; return; } NSUInteger tag = currentLeftBtn.tag; if (tag < _leftBtns.count-1) { //自動下移 [self tapBtn:_leftBtns[tag+1]]; } else{ [self tapBtn:_leftBtns[0]]; //重新開始 } } //繪製預設已經連線的選項,此處僅僅做成績預覽使用,不能再編輯 - (void)showLianXianResult{ for (UIButton *leftBtn in _leftBtns) { leftBtn.layer.borderColor = [UIColor lightGrayColor].CGColor; leftBtn.selected = leftBtn.userInteractionEnabled = NO; } for (UIButton *rightBtn in _rightBtns) { rightBtn.layer.borderColor = [UIColor lightGrayColor].CGColor; rightBtn.selected = rightBtn.userInteractionEnabled = NO; } if (self.lianxianModel.relationships.count == 0) { return; } NSMutableArray *relationslineArray = [NSMutableArray array]; for (NSString *result in self.lianxianModel.relationships) { NSString *question = [[result componentsSeparatedByString:@"-"] firstObject]; NSString *option = [[result componentsSeparatedByString:@"-"] lastObject]; NSMutableArray *pointArray = [NSMutableArray array]; for (UIButton *leftBtn in _leftBtns) { if ([leftBtn.currentTitle isEqualToString:question]) { CGPoint startPoint = CGPointMake(CGRectGetMaxX(leftBtn.frame), CGRectGetMidY(leftBtn.frame)); NSString *startPointString = NSStringFromCGPoint(startPoint); [pointArray addObject:startPointString]; break; } } for (UIButton *rightBtn in _rightBtns) { if ([rightBtn.currentTitle isEqualToString:option]) { CGPoint endPoint = CGPointMake(CGRectGetMinX(rightBtn.frame), CGRectGetMidY(rightBtn.frame)); NSString *endPointString = NSStringFromCGPoint(endPoint); [pointArray addObject:endPointString]; break; } } [relationslineArray addObject:pointArray]; } if (relationslineArray.count > 0) { [[NSNotificationCenter defaultCenter] postNotificationName:kFreshDrawLineNotification object:relationslineArray]; } } //重置初始狀態 - (void)restStatus:(NSNotification *)notification{ for (UIButton *leftBtn in _leftBtns) { leftBtn.selected = NO; leftBtn.layer.borderColor = [UIColor lightGrayColor].CGColor; [self tapBtn:_leftBtns[0]]; //重新開始 } } @end

相關推薦

iOS練習題中如何用技術實現一個連線

// // LianXianComponentsView.m // LianxianDemo // // Created by 夏遠全 on 2018/2/6. // Copyright © 2018年 beijing. All rights reserved. // #import "LianX

mktime很慢就自己實現一個

tdi ati 十分 ace += timestamp src clas [] mktime很慢就自己去實現一個吧

IOS開發學習筆記十二 實現一個簡單的答題器

效果圖:專案地址 專案新增素材,新增plist檔案,並新增plist裡面的字典資料對應的model物件 module標頭檔案: #import <Foundation/Foundation.h> @interface CZQuestion :

flask學習如何使用flask-wtf實現一個表單

使用flask-wtf實現表單分為以下幾步: 1.安裝flask-wtf擴充套件,並且匯入對應的方法 from flask_wtf import FlaskForm from wtforms import StringField, PasswordField,SubmitField

python3利用切片操作,實現一個trim()函式,去除字串首尾的空格

  利用切片操作,實現一個trim()函式,去除字串首尾的空格,注意不要呼叫str的strip()方法: 解決該題的思路如下: 1、判斷是否是空字串; 2、迴圈判斷字串首部第一個元素是否有空格,如果有,則去掉,再判斷是否是空字串,如果是,直接輸出; 3、迴圈判斷字串尾部

嘗試實現一個Promise

function resolve_promise_value(promise,value) {//PromiseA+的實現 var then; /* ret false 說明沒有執行promise._resolve裡的函式

學習筆記之Python 切片利用切片操作,實現一個trim()函式,去除字串首尾的空格

需求: Python 切片:利用切片操作,實現一個trim()函式,去除字串首尾的空格,不呼叫str的strip()方法。# Basic Version: def trim(s): length = len(s) if length > 0:

神奇的sh管道操作|原理 ,實現一個支援管道操作的grep

C程式的輸入有引數和標準輸入,shell管道是將上一個程式的stdout重定向 到下一個程式的stdin,跟程式引數無關。 echo無法使用管道,因為它列印引數,而不從stdin中讀取資料。 支援管道的C程式示例,它將列印引數和stdin的內容: #include<

編譯原理用Flex和 Bison實現一個功能更為強大的計算器

 用Flex和 Bison實現一個功能更為強大的計算器,包含以下運算: a)加、減、乘、除運算 b)乘方、開方運算 c)位運算 – 與 & 、或 |、非 ~... d)階乘運算 !對數運算log 1.進一步完善計算器功能,實現對以下語法結構的

IOS開發UI篇--使用UICollectionView實現一個無限輪播的案例

一、案例演示 本案例Demo演示的是一個首頁輪播的案例,支援手動輪播和自動輪播。知識點主要集中在UICollectionView和NSTimer的使用。 二、知識儲備 2.1、UICollectionView橫向佈局 只需要設定UICollect

劍指offer用兩個棧實現一個隊列

ack 特性 壓入 [] elf 即將 init 出隊 劍指offer 題目描述用兩個棧來實現一個隊列,完成隊列的Push和Pop操作。 隊列中的元素為int類型。 類似漢諾塔,當我們需要將棧A下面的元素出棧的時候可以先將棧A中的元素全部逆序壓入到另一個棧B,這時棧B保存

ASP.NET Core SignalR 學習訊息通訊,實現一個訊息通知

 什麼是 SignalR        目前我用業餘時間正在做一個部落格系統,其中有個功能就是評論通知,就是假如A使用者評論B使用者的時候,如果B使用者首頁處於開啟狀態,那麼就會提示B使用者有未讀訊息。暫時用SignalR來實現這個功能。我也是看了兩天的資料才

Flask學習【第3篇】藍圖、基於DBUtils實現資料庫連線池、上下文管理等 基於DBUtils實現資料庫連線

基於DBUtils實現資料庫連線池 小知識: 1、子類繼承父類的三種方式 class Dog(Animal): #子類 派生類 def

Knative 實戰三步走!基於 Knative Serverless 技術實現一個短網址服務

短網址顧名思義就是使用比較短的網址代替很長的網址。維基百科上面的解釋是這樣的: 短網址又稱網址縮短、縮短網址、URL 縮短等,指的是一種網際網路上的技術與服務,此服務可以提供一個非常短小的 URL 以代替原來的可能較長的URL,將長的 URL 位址縮短。使用者訪問縮短後的 URL 時通常將會重定向到原來的長

day1作業編寫登錄窗口一個文件實現

insert size strong 文件類型 增加 機會 如果 user_list ssa 思路: 1、參考模型,這個作業我參考了linux的登錄認證流程以及結合網上銀行支付寶等鎖定規則; 1)認證流程參考的是Linux的登錄:當你輸入完用戶名

設計模式 自己手動實現一個觀察者設計模式

package rgs name gree 觀察者設計模式 forecast server 它的 upd 觀察者模式: 定義了對象之間的一對多依賴,這樣一來。當一個對象(被觀察者)改變狀態時,它的全部依賴者(觀察者)都會收到通知並自己主動更新。 在觀察者模式中,會

傳智自己簡單實現一個struts2框架的demo

throws for request 運行 本地化 color ray run main struts2的結構圖: 代碼實現: 組織結構: 主要代碼: package cn.itcast.config; import org.apache.log4j.Logg

ATM模擬實現一個ATM + 購物商城程序

模擬實現 操作日誌 提現 賬戶 管理 購物商城 裝飾 用戶 程序 額度 15000或自定義 實現購物商城,買東西加入 購物車,調用信用卡接口結賬 可以提現,手續費5% 支持多賬戶登錄 支持賬戶間轉賬 記錄每月日常消費流水 提供還款接口 ATM記錄操作日誌 提供管理接口,包括

anime.js 實戰實現一個帶有描邊動畫效果的復選框

由於 圓角 理解 http 中心 timeline 實例 描邊 evel 在網頁或者是APP的開發中,動畫運用得當可以起到錦上添花的作用。正確使用動畫,不但可以有助於用戶理解交互的作用,還可以大大提高網頁應用的魅力和使用體驗。並且在現在的網頁開發中,動畫已經成為了一個設計的

java算法面試題排序都有哪幾種方法?請列舉。用JAVA實現一個快速排序。選擇冒泡快速集合至少4種方法排序

算法 err div println rda print 算法面試 ++ 快速排序 package com.swift; import java.util.ArrayList; import java.util.Collections; import java.util