cell的几种状态

unplaced:该instance还未被摆放

placed:该instance已经被摆放,但可以被其他命令移动

legalize_only:该instance已经被摆放,但只能被legalize移动

fixed:该instance已经被摆放,可以被resize,但是不能被其他命令移动

locked:该instance已经被摆放,任何命令,包括手工,都不可以动它

size_only:位置可以一定,但是cell的大小不可以动。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>俄罗斯方块</title> [removed] var TETRIS_ROWS = 20; var TETRIS_COLS = 14; var CELL_SIZE = 24; // 没方块是0 var NO_BLOCK = 0; var tetris_canvas; var tetris_ctx; // 记录当前积分 var curScore = 0; // 记录当前速度 var curSpeed = 1; // 记录曾经的最高积分 var maxScore = 0; var curScoreEle , curSpeedEle , maxScoreEle; var curTimer; // 记录当前是否游戏中的旗标 var isPlaying = true; // 记录正在下掉的四个方块 var currentFall; // 该数组用于记录底下已经固定下来的方块。 var tetris_status = []; for (var i = 0; i < TETRIS_ROWS ; i++ ) { tetris_status[i] = []; for (var j = 0; j < TETRIS_COLS ; j++ ) { tetris_status[i][j] = NO_BLOCK; } } // 定义方块的颜色 colors = ["#fff", "#f00" , "#0f0" , "#00f" , "#c60" , "#f0f" , "#0ff" , "#609"]; // 定义几种可能出现的方块组合 var blockArr = [ // 代表第一种可能出现的方块组合:Z [ {x: TETRIS_COLS / 2 - 1 , y:0 , color:1}, {x: TETRIS_COLS / 2 , y:0 ,color:1}, {x: TETRIS_COLS / 2 , y:1 ,color:1}, {x: TETRIS_COLS / 2 + 1 , y:1 , color:1} ], // 代表第二种可能出现的方块组合:反Z [ {x: TETRIS_COLS / 2 + 1 , y:0 , color:2}, {x: TETRIS_COLS / 2 , y:0 , color:2}, {x: TETRIS_COLS / 2 , y:1 , color:2}, {x: TETRIS_COLS / 2 - 1 , y:1 , color:2} ], // 代表第三种可能出现的方块组合: 田 [ {x: TETRIS_COLS / 2 - 1 , y:0 , color:3}, {x: TETRIS_COLS / 2 , y:0 , color:3}, {x: TETRIS_COLS / 2 - 1 , y:1 , color:3}, {x: TETRIS_COLS / 2 , y:1 , color:3} ], // 代表第四种可能出现的方块组合:L [ {x: TETRIS_COLS / 2 - 1 , y:0 , color:4}, {x: TETRIS_COLS / 2 - 1, y:1 , color:4}, {x: TETRIS_COLS / 2 - 1 , y:2 , color:4}, {x: TETRIS_COLS / 2 , y:2 , color:4} ], // 代表第五种可能出现的方块组合:J [ {x: TETRIS_COLS / 2 , y:0 , color:5}, {x: TETRIS_COLS / 2 , y:1, color:5}, {x: TETRIS_COLS / 2 , y:2, color:5}, {x: TETRIS_COLS / 2 - 1, y:2, color:5} ], // 代表第六种可能出现的方块组合 : 条 [ {x: TETRIS_COLS / 2 , y:0 , color:6}, {x: TETRIS_COLS / 2 , y:1 , color:6}, {x: TETRIS_COLS / 2 , y:2 , color:6}, {x: TETRIS_COLS / 2 , y:3 , color:6} ], // 代表第七种可能出现的方块组合 : ┵ [ {x: TETRIS_COLS / 2 , y:0 , color:7}, {x: TETRIS_COLS / 2 - 1 , y:1 , color:7}, {x: TETRIS_COLS / 2 , y:1 , color:7}, {x: TETRIS_COLS / 2 + 1, y:1 , color:7} ] ]; // 定义初始化正在下掉的方块 var initBlock = function() { var rand = Math.floor(Math.random() * blockArr.length); // 随机生成正在下掉的方块 currentFall = [ {x: blockArr[rand][0].x , y: blockArr[rand][0].y , color: blockArr[rand][0].color}, {x: blockArr[rand][1].x , y: blockArr[rand][1].y , color: blockArr[rand][1].color}, {x: blockArr[rand][2].x , y: blockArr[rand][2].y , color: blockArr[rand][2].color}, {x: blockArr[rand][3].x , y: blockArr[rand][3].y , color: blockArr[rand][3].color} ]; }; // 定义一个创建canvas组件的函数 var createCanvas = function(rows , cols , cellWidth, cellHeight) { tetris_canvas = document.createElement("canvas"); // 设置canvas组件的高度、宽度 tetris_canvas.width = cols * cellWidth; tetris_canvas.height = rows * cellHeight; // 设置canvas组件的边框 tetris_canvas.style.border = "1px solid black"; // 获取canvas上的绘图API tetris_ctx = tetris_canvas.getContext('2d'); // 开始创建路径 tetris_ctx.beginPath(); // 绘制横向网络对应的路径 for (var i = 1 ; i < TETRIS_ROWS ; i++) { tetris_ctx.moveTo(0 , i * CELL_SIZE); tetris_ctx.lineTo(TETRIS_COLS * CELL_SIZE , i * CELL_SIZE); } // 绘制竖向网络对应的路径 for (var i = 1 ; i < TETRIS_COLS ; i++) { tetris_ctx.moveTo(i * CELL_SIZE , 0); tetris_ctx.lineTo(i * CELL_SIZE , TETRIS_ROWS * CELL_SIZE); } tetris_ctx.closePath(); // 设置笔触颜色 tetris_ctx.strokeStyle = "#aaa"; // 设置线条粗细 tetris_ctx.lineWidth = 0.3; // 绘制线条 tetris_ctx.stroke(); } // 绘制俄罗斯方块的状态 var drawBlock = function() { for (var i = 0; i < TETRIS_ROWS ; i++ ) { for (var j = 0; j < TETRIS_COLS ; j++ ) { // 有方块的地方绘制颜色 if(tetris_status[i][j] != NO_BLOCK) { // 设置填充颜色 tetris_ctx.fillStyle = colors[tetris_status[i][j]]; // 绘制矩形 tetris_ctx.fillRect(j * CELL_SIZE + 1 , i * CELL_SIZE + 1, CELL_SIZE - 2 , CELL_SIZE - 2); } // 没有方块的地方绘制白色 else { // 设置填充颜色 tetris_ctx.fillStyle = 'white'; // 绘制矩形 tetris_ctx.fillRect(j * CELL_SIZE + 1 , i * CELL_SIZE + 1 , CELL_SIZE - 2 , CELL_SIZE - 2); } } } } // 当页面加载完成时,执行该函数里的代码。 window. { // 创建canvas组件 createCanvas(TETRIS_ROWS , TETRIS_COLS , CELL_SIZE , CELL_SIZE); document.body.appendChild(tetris_canvas); curScoreEle = document.getElementById("curScoreEle"); curSpeedEle = document.getElementById("curSpeedEle"); maxScoreEle = document.getElementById("maxScoreEle"); // 读取Local Storage里的tetris_status记录 var tmpStatus = localStorage.getItem("tetris_status"); tetris_status = tmpStatus == null ? tetris_status : JSON.parse(tmpStatus); // 把方块状态绘制出来 drawBlock(); // 读取Local Storage里的curScore记录 curScore = localStorage.getItem("curScore"); curScore = curScore == null ? 0 : parseInt(curScore); curScoreEle[removed] = curScore; // 读取Local Storage里的maxScore记录 maxScore = localStorage.getItem("maxScore"); maxScore = maxScore == null ? 0 : parseInt(maxScore); maxScoreEle[removed] = maxScore; // 读取Local Storage里的curSpeed记录 curSpeed = localStorage.getItem("curSpeed"); curSpeed = curSpeed == null ? 1 : parseInt(curSpeed); curSpeedEle[removed] = curSpeed; // 初始化正在下掉的方块 initBlock(); // 控制每隔固定时间执行一次向下”掉“ curTimer = setInterval("moveDown();" , 500 / curSpeed); } // 判断是否有一行已满 var lineFull = function() { // 依次遍历每一行 for (var i = 0; i < TETRIS_ROWS ; i++ ) { var flag = true; // 遍历当前行的每个单元格 for (var j = 0 ; j < TETRIS_COLS ; j++ ) { if(tetris_status[i][j] == NO_BLOCK) { flag = false; break; } } // 如果当前行已全部有方块了 if(flag) { // 将当前积分增加100 curScoreEle[removed] = curScore+= 100; // 记录当前积分 localStorage.setItem("curScore" , curScore); // 如果当前积分达到升级极限。 if( curScore >= curSpeed * curSpeed * 500) { curSpeedEle[removed] = curSpeed += 1; // 使用Local Storage记录curSpeed。 localStorage.setItem("curSpeed" , curSpeed); clearInterval(curTimer); curTimer = setInterval("moveDown();" , 500 / curSpeed); } // 把当前行的所有方块下移一行。 for (var k = i ; k > 0 ; k--) { for (var l = 0; l < TETRIS_COLS ; l++ ) { tetris_status[k][l] =tetris_status[k-1][l]; } } // 消除方块后,重新绘制一遍方块 drawBlock(); //② } } } // 控制方块向下掉。 var moveDown = function() { // 定义能否下掉的旗标 var canDown = true; //① // 遍历每个方块,判断是否能向下掉 for (var i = 0 ; i < currentFall.length ; i++) { // 判断是否已经到“最底下” if(currentFall[i].y >= TETRIS_ROWS - 1) { canDown = false; break; } // 判断下一格是否“有方块”, 如果下一格有方块,不能向下掉 if(tetris_status[currentFall[i].y + 1][currentFall[i].x] != NO_BLOCK) { canDown = false; break; } } // 如果能向下“掉” if(canDown) { // 将下移前的每个方块的背景色涂成白色 for (var i = 0 ; i < currentFall.length ; i++) { var cur = currentFall[i]; // 设置填充颜色 tetris_ctx.fillStyle = 'white'; // 绘制矩形 tetris_ctx.fillRect(cur.x * CELL_SIZE + 1 , cur.y * CELL_SIZE + 1 , CELL_SIZE - 2 , CELL_SIZE - 2); } // 遍历每个方块, 控制每个方块的y坐标加1。 // 也就是控制方块都下掉一格 for (var i = 0 ; i < currentFall.length ; i++) { var cur = currentFall[i]; cur.y ++; } // 将下移后的每个方块的背景色涂成该方块的颜色值 for (var i = 0 ; i < currentFall.length ; i++) { var cur = currentFall[i]; // 设置填充颜色 tetris_ctx.fillStyle = colors[cur.color]; // 绘制矩形 tetris_ctx.fillRect(cur.x * CELL_SIZE + 1 , cur.y * CELL_SIZE + 1 , CELL_SIZE - 2 , CELL_SIZE - 2); } } // 不能向下掉 else { // 遍历每个方块, 把每个方块的值记录到tetris_status数组中 for (var i = 0 ; i < currentFall.length ; i++) { var cur = currentFall[i]; // 如果有方块已经到最上面了,表明输了 if(cur.y < 2) { // 清空Local Storage中的当前积分值、游戏状态、当前速度 localStorage.removeItem("curScore"); localStorage.removeItem("tetris_status"); localStorage.removeItem("curSpeed"); if(confirm("您已经输了!是否参数排名?")) { // 读取Local Storage里的maxScore记录 maxScore = localStorage.getItem("maxScore"); maxScore = maxScore == null ? 0 : maxScore ; // 如果当前积分大于localStorage中记录的最高积分 if(curScore >= maxScore) { // 记录最高积分 localStorage.setItem("maxScore" , curScore); } } // 游戏结束 isPlaying = false; // 清除计时器 clearInterval(curTimer); return; } // 把每个方块当前所在位置赋为当前方块的颜色值 tetris_status[cur.y][cur.x] = cur.color; } // 判断是否有“可消除”的行 lineFull(); // 使用Local Storage记录俄罗斯方块的游戏状态 localStorage.setItem("tetris_status" , JSON.stringify(tetris_status)); // 开始一组新的方块。 initBlock(); } } // 定义左移方块的函数 var moveLeft = function() { // 定义能否左移的旗标 var canLeft = true; for (var i = 0 ; i < currentFall.length ; i++) { // 如果已经到了最左边,不能左移 if(currentFall[i].x <= 0) { canLeft = false; break; } // 或左边的位置已有方块,不能左移 if (tetris_status[currentFall[i].y][currentFall[i].x - 1] != NO_BLOCK) { canLeft = false; break; } } // 如果能左移 if(canLeft) { // 将左移前的每个方块的背景色涂成白色 for (var i = 0 ; i < currentFall.length ; i++) { var cur = currentFall[i]; // 设置填充颜色 tetris_ctx.fillStyle = 'white'; // 绘制矩形 tetris_ctx.fillRect(cur.x * CELL_SIZE +1 , cur.y * CELL_SIZE + 1 , CELL_SIZE - 2, CELL_SIZE - 2); } // 左移所有正在下掉的方块 for (var i = 0 ; i < currentFall.length ; i++) { var cur = currentFall[i]; cur.x --; } // 将左移后的每个方块的背景色涂成方块对应的颜色 for (var i = 0 ; i < currentFall.length ; i++) { var cur = currentFall[i]; // 设置填充颜色 tetris_ctx.fillStyle = colors[cur.color]; // 绘制矩形 tetris_ctx.fillRect(cur.x * CELL_SIZE + 1 , cur.y * CELL_SIZE + 1, CELL_SIZE - 2 , CELL_SIZE - 2); } } } // 定义右移方块的函数 var moveRight = function() { // 定义能否右移的旗标 var canRight = true; for (var i = 0 ; i < currentFall.length ; i++) { // 如果已到了最右边,不能右移 if(currentFall[i].x >= TETRIS_COLS - 1) { canRight = false; break; } // 如果右边的位置已有方块,不能右移 if (tetris_status[currentFall[i].y][currentFall[i].x + 1] != NO_BLOCK) { canRight = false; break; } } // 如果能右移 if(canRight) { // 将右移前的每个方块的背景色涂成白色 for (var i = 0 ; i < currentFall.length ; i++) { var cur = currentFall[i]; // 设置填充颜色 tetris_ctx.fillStyle = 'white'; // 绘制矩形 tetris_ctx.fillRect(cur.x * CELL_SIZE + 1 , cur.y * CELL_SIZE + 1 , CELL_SIZE - 2 , CELL_SIZE - 2); } // 右移所有正在下掉的方块 for (var i = 0 ; i < currentFall.length ; i++) { var cur = currentFall[i]; cur.x ++; } // 将右移后的每个方块的背景色涂成各方块对应的颜色 for (var i = 0 ; i < currentFall.length ; i++) { var cur = currentFall[i]; // 设置填充颜色 tetris_ctx.fillStyle = colors[cur.color]; // 绘制矩形 tetris_ctx.fillRect(cur.x * CELL_SIZE + 1 , cur.y * CELL_SIZE + 1 , CELL_SIZE - 2, CELL_SIZE -2); } } } // 定义旋转方块的函数 var rotate = function() { // 定义记录能否旋转的旗标 var canRotate = true; for (var i = 0 ; i < currentFall.length ; i++) { var preX = currentFall[i].x; var preY = currentFall[i].y; // 始终以第三个方块作为旋转的中心, // i == 2时,说明是旋转的中心 if(i != 2) { // 计算方块旋转后的x、y坐标 var afterRotateX = currentFall[2].x + preY - currentFall[2].y; var afterRotateY = currentFall[2].y + currentFall[2].x - preX; // 如果旋转后所在位置已有方块,表明不能旋转 if(tetris_status[afterRotateY][afterRotateX + 1] != NO_BLOCK) { canRotate = false; break; } // 如果旋转后的坐标已经超出了最左边边界 if(afterRotateX < 0 || tetris_status[afterRotateY - 1][afterRotateX] != NO_BLOCK) { moveRight(); afterRotateX = currentFall[2].x + preY - currentFall[2].y; afterRotateY = currentFall[2].y + currentFall[2].x - preX; break; } if(afterRotateX < 0 || tetris_status[afterRotateY-1][afterRotateX] != NO_BLOCK) { moveRight(); break; } // 如果旋转后的坐标已经超出了最右边边界 if(afterRotateX >= TETRIS_COLS - 1 || tetris_status[afterRotateY][afterRotateX+1] != NO_BLOCK) { moveLeft(); afterRotateX = currentFall[2].x + preY - currentFall[2].y; afterRotateY = currentFall[2].y + currentFall[2].x - preX; break; } if(afterRotateX >= TETRIS_COLS - 1 || tetris_status[afterRotateY][afterRotateX+1] != NO_BLOCK) { moveLeft(); break; } } } // 如果能旋转 if(canRotate) { // 将旋转移前的每个方块的背景色涂成白色 for (var i = 0 ; i < currentFall.length ; i++) { var cur = currentFall[i]; // 设置填充颜色 tetris_ctx.fillStyle = 'white'; // 绘制矩形 tetris_ctx.fillRect(cur.x * CELL_SIZE + 1 , cur.y * CELL_SIZE + 1 , CELL_SIZE - 2, CELL_SIZE - 2); } for (var i = 0 ; i < currentFall.length ; i++) { var preX = currentFall[i].x; var preY = currentFall[i].y; // 始终以第三个方块作为旋转的中心, // i == 2时,说明是旋转的中心 if(i != 2) { currentFall[i].x = currentFall[2].x + preY - currentFall[2].y; currentFall[i].y = currentFall[2].y + currentFall[2].x - preX; } } // 将旋转后的每个方块的背景色涂成各方块对应的颜色 for (var i = 0 ; i < currentFall.length ; i++) { var cur = currentFall[i]; // 设置填充颜色 tetris_ctx.fillStyle = colors[cur.color]; // 绘制矩形 tetris_ctx.fillRect(cur.x * CELL_SIZE + 1 , cur.y * CELL_SIZE + 1 , CELL_SIZE - 2, CELL_SIZE - 2); } } } window.focus(); // 为窗口的按键事件绑定事件监听器 window. { switch(evt.keyCode) { // 按下了“向下”箭头 case 40: if(!isPlaying) return; moveDown(); break; // 按下了“向左”箭头 case 37: if(!isPlaying) return; moveLeft(); break; // 按下了“向右”箭头 case 39: if(!isPlaying) return; moveRight(); break; // 按下了“向上”箭头 case 38: if(!isPlaying) return; rotate(); break; } } [removed] <style type="text/css"> body>div { font-size: 13pt; padding-bottom: 8px; } span { font-size: 20pt; color: red; } </style> </head> <body> <h2>俄罗斯方块</h2> <div <div id="curSpeedEle"></span> 当前积分:<span id="curScoreEle"></span></div> <div id="maxScoreEle"></span></div> </div> </body> </html>
因为项目的源代码比较大,就没法上传了;已开源在gitHub中,还在不断完善更新补充功能,地址:https://github.com/wujunyang/MobileProject;感兴趣可以一起完善,如果对你有帮助记得给个星哈;下面简单介绍一下已经集成的功能(另外一些框架的分层及帮助类可以直接查看源代码); 3.1 集成百度地图(3.0.0版),目前有百度定位功能(ThirdMacros.h修改相应的key值) 3.2 集成友盟统计(ThirdMacros.h修改相应的key值) 3.3 集成CocoaLumberjack日志记录 3.4 引入第三方inputAccessoryView 解决为一些无输入源的控件添加输入响应。比如按钮、cell、view等 3.5 整理封装WJScrollerMenuView 用于解决滚动菜单的使用 3.6 集成个推消息推送功能(ThirdMacros.h修改相应的key值),证书也要用你们自个的消息证书; 3.7 集成友盟分享SDK,并在登录页实现的(QQ,微信,新浪)三种的第三方登录功能(ThirdMacros.h修改相应的key值) 3.8 集成友盟第三方分享(QQ空间分享,微信朋友圈,新浪微博分享,QQ微博分享,微信好友) 3.9 增加关于CocoaLumberjack日志记录的展示及查看页面 3.10 增加百度地图显示页面功能实例,实现在地图上显示几个坐标点,并自定义坐标点的图标跟弹出提示窗内容,实现当前定位并画出行车路线图; 3.11 增加FLEX,在本地测试版本开启,FLEX是Flipboard官方发布的一组专门用于iOS开发的应用内调试工具,能在模拟器和物理设备上良好运作,而开发者也无需将其连接到LLDB/Xcode或其他远程调试服务器,即可直接查看或修改正在运行的App的每一处状态。 3.12 增加FCUIID帮助类,用于获取设备标识 3.13 增加热更新JSPatch插件,并增加相应的帮助类及测试功能(JSPatchViewController) Status API Training Shop Blog About
状态栏20键盘高度216导航44 最少2位 补0 // UIColor *color2 = [[UIColor alloc] initWithRed:0 green:1 blue:0 alpha:1]; // button setTitle:@"点我吧" forState:UIControlStateNormal]; // [button addTarget:self action:@selector(buttonClick) forControlEvents:UIControlEventTouchUpInside]; Target目标 action行动 [button setTitleColor:[UIColor whiteColor] forState:UIControlStateSelected]; //字体在点击时候的颜色 button.selected=YES;//激活forState:UIControlStateSelected状态 [UIButton buttonWithType:UIButtonTypeRoundedRect];按钮样式 button1.tag = [str intValue]; 标记 //initWithNibName将控制器绑定xib的方法,如果xib的名称和控制器的类名称相同的时候,直接写init(会自动绑定同名的xib)就可以,如果xib的名称和类名称不同的话,必须手动调用此方法来进行绑定 ZYTwoViewController *two=[[ZYTwoViewController alloc]initWithNibName:@"Empty" bundle:nil]; //因为UIImageView的用户可交互性默认是关闭的,所以把按钮放在他身上时,按钮是不能点击的,把可交互性打开以后,按钮就能够被点击 imgView.userInteractionEnabled=YES; enabled授权给 Interaction交互 //将序列帧数组赋给UIImageView的animationImages属性 imageview.animationImages = imageArray; //设置动画时间 imageview.animationDuration = 2; Duration持续时间 //设置动画次数 0 表示无限 imageview.animationRepeatCount = 0; Repeat重复次数 //开始播放动画 [imageview startAnimating]; / //要动画的对象和他的状态 // imageView.frame = CGRectMake(200, 200, 50, 50); // //设置透明度 // imageView.alpha = 0.2; //创建一个window对象,window的frame跟屏幕大小一致 self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; Screen 屏 //让window显示到屏幕上 [self.window makeKeyAndVisible]; Visible可见的 //得到全局的屏幕对象 UIScreen *screen = [UIScreen mainScreen]; //获得屏幕的大小 CGRect rect = screen.bounds; //判断btn这个指针指向的是UIButton的对象的时候才清空 if([btn isKindOfClass:[UIButton class]]){ [btn removeFromSuperview]; } //判断这个视图是否是他的父视图有 if([_imgView isDescendantOfView:cell]){ [_imgView removeFromSuperview]; } //让键盘放弃第一响应,也就是让textfield不再处于活动状态,键盘就会下去 //resignFirstResponder 这个方法的功能就是让属于textfield的键盘下去 [_textField resignFirstResponder]; resign失去 responder响应 //成为第一响应者 [_textField becomeFirstResponder]; become 变成 //enabled 可用的,textfield 不响应事件 //_salaryField.enabled = NO; // _textField.placeholder = @"请输入您的银行卡账号"; placeholder 占位符 // _textField.keyboardType = UIKeyboardTypeNumberPad; keyboard键盘 /secure 安全 text 文本 entry 输入 //textField.secureTextEntry = YES; //点击键盘的return键绑定当前类对象的down这个方法 //此方法可以有参数,也可以没有参数,如果没有参数系统不会给你穿参数,如果有参数,只能有一个参数,无论你所指定的参数类型是什么,系统只会把tf本身给传过去 [tf addTarget:self action:@selector(down:) forControlEvents:UIControlEventEditingDidEndOnExit]; //因为tag为999的本来就是UITextField类型所以可以强制转换成UITextField类型,如果他本来就不是UITextField,非要强转语法不会报错,但运行时就会出现问题(例如披着羊皮的郎) // UITextField *tf=(UITextField *)[self.window viewWithTag:999]; //让父视图取消编辑会让其身上的所有文本框都取消相应 [self.window endEditing:YES]; //将子视图在前面 [self.window bringSubviewToFront:_taiyang]; //超出这个view的边界的控件不再显示 [_infoView setClipsToBounds:YES]; //UIView 静态方法,开始一个动画 [UIView beginAnimations:nil context:nil]; begin 开始 //animation 动画 duration 间隔时间 [UIView setAnimationDuration:1]; //从当前状态设置动画开始 [UIView setAnimationBeginsFromCurrentState:YES]; //设置动画的重复次数,0表示1次 [UIView setAnimationRepeatCount:MAXFLOAT]; //设置动画的自动反转,出去以后原路返回 [UIView setAnimationRepeatAutoreverses:YES]; //设置动画的效果,慢入慢出 [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; //只有设置了context,并且设置代理和动画结束后调用的方法,系统会将context传过去 [UIView beginAnimations:nil context:imgView]; //设置代理(委托) [UIView setAnimationDelegate:self]; //设置动画结束以后调用的方法,我们只需要把context设置为imgView,系统就会调用此方法给传参数 [UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)]; -(void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context{ NSLog(@"1111"); UIImageView *imgView=(UIImageView *)context; [imgView removeFromSuperview]; } //Transition 转换,变换 Curl 卷 //1.动画的样式 //2.要在哪个视图上做动画,一般是动画视图的父视图 [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:_window cache:YES]; //commit 提交 [UIView commitAnimations]; //索引为0表示先添加的子视图,跟子视图的tag没有关系 //交换两个子视图的先后位置 [self.window exchangeSubviewAtIndex:0 withSubviewAtIndex:1]; exchange交换 Subview 代替 //remove 移除 from 从 superview 父视图 //把自身从父视图中移除 //[_loginControl removeFromSuperview]; //设置数组容量为0,可变数组随便设置只是个初始化的值 _diJiArr=[[NSMutableArray alloc]initWithCapacity:0]; // CGAffineTransform a = {1,2,3,4,1,1}; //CGAffineTransformMakeRotation 方法的作用就是传进去一个角度(计量单位不是度,是弧度),方法内部帮你生成一个这个角度所对应的旋转矩阵 //rotate 旋转 CGAffineTransform a = CGAffineTransformMakeRotation(-3.1415926 / 2); //在原有imageView.transform的基础上再转多少度 CGAffineTransform c = CGAffineTransformRotate(imageView.transform, 3.1415926 / 2); //scale 缩放 // CGAffineTransform b = CGAffineTransformMakeScale(2, 2); //修改uiview 的矩阵,仿射变换 imageView.transform = a; //设置阴影偏移量(正值往右偏,正值往下偏移) label.shadowOffset=CGSizeMake(5, 10); //在oc中,空对象调用方法或属性不会引起程序报错或崩溃,但是也不会有任何事件发生 // NSString *str = nil; // [str length]; //判断两个字符串是否相等,不能使用==,使用等号是判断两个对象是否是一个对象,也就是是否是一个内存地址。 //判断字符串的内容是否相同应该使用nsstring的isEqualToString:方法 //在低版本的时候,如果直接点击注册按钮,没有点击具体的输入框,得到输入框中的内容为nil,如果点击输入框,但是没有输入任何内容,这个时候点击注册按钮获得的内容为@"".这是系统懒加载的结果。 // if ([registName isEqualToString:@""] || registName == nil) // { // NSLog(@"不能为空"); // return; // } //可以这样写,把上述两种情况都涵盖 //registName.length 获得字符串的长度 if (registName.length <= 0) //获取手指在屏幕上的坐标 UITouch * touch = [touches anyObject]; CGPoint point = [touch locationInView:self.view]; NSLog(@"ppp===%@",NSStringFromCGPoint(point)); CGPoint point=[[touches anyObject] locationInView:self.window]; //判断此时手指在屏幕上的坐标是否在飞机上,也就是说手指是否按在飞机上,如果是的话,改变飞机的中心点坐标到手指的位置上 if(CGRectContainsPoint(_planeView.frame, point)){ _planeView.center=point; } UIActionSheet *action=[[UIActionSheet alloc]initWithTitle:@"提示" delegate:self cancelButtonTitle:@"红" destructiveButtonTitle:@"绿" otherButtonTitles:@"蓝", nil]; [action showInView:self.view]; //弹出框 Alert 警告,alertView是局部变量,他的作用域只在if这个大括号内 UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"警告" message:@"用户名不能为空" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:nil]; //show 展现 ,显示alertview [alertView show]; return; if (![_registPasswordField.text isEqualToString:_registConfirmPasswordField.text]) self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.backgroundColor = [UIColor whiteColor]; //frame是相对于其父视图而言的 //bounds是相对于自身而言的,bounds的xy是设置自己坐标系的左上角坐标,会影响其子视图 //一般使用bounds不设置x和y只设置宽和高 //center是相对于其父视图而言的,是CGpoint类型 _vi.bounds=CGRectMake(0, 0, 200, 200); // vi.center=CGPointMake(160, 240); _vi.center=_window.center; //arc4random()%256取一个随机值,随机值的范围为0-255 _vi.backgroundColor=[UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1]; 屏幕触发事件 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event TestViewController *test=[[TestViewController alloc]init]; //实际作用就是将test的view放在window上 self.window.rootViewController=test; //initWithNibName将控制器绑定xib的方法,如果xib的名称和控制器的类名称相同的时候,直接写init(会自动绑定同名的xib)就可以,如果xib的名称和类名称不同的话,必须手动调用此方法来进行绑定 ZYTwoViewController *two=[[ZYTwoViewController alloc]initWithNibName:@"Empty" bundle:nil]; self.window.rootViewController=two; //每隔0.05秒调用当前类对象的boFang方法,不传参数,一直重复 _tim=[NSTimer scheduledTimerWithTimeInterval:.1 target:self selector:@selector(boFang) userInfo:nil repeats:YES]; } scheduled 固定时间 Interval间隔时间 repeats重复 //bool orClose; -(void)btnPress{ // orClose=!orClose; //判断定时器的指针是否存在(定时器的对象是否存在) if(_tim){ //必须在定时器失效以后将定时器的指针至为空 [_tim invalidate]; invalidate使…无效 _tim=nil; }else{ _tim=[NSTimer scheduledTimerWithTimeInterval:.1 target:self selector:@selector(boFang) userInfo:nil repeats:YES]; } /* int a=5,b=3; //三目运算符 int c=a>b?1:2; //不能深度赋值 //相当于 //imgView.frame.origin.y+=5; if(a>b){ c=1; }else{ c=2; } */ CGRectIntersectsRect(zidan.frame, diji.frame) //有交叉就怎么怎么样 //Activity 活动 Indicator指示器 // UIActivityIndicatorView *ai = [[UIActivityIndicatorView alloc] init]; // ai.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge; // ai.backgroundColor = [UIColor blackColor]; // ai.frame = CGRectMake(100, 200, 100, 100); // ai.hidesWhenStopped = NO; // [_loginControl addSubview:ai]; // [ai startAnimating]; //使用系统的协议方法:1、.h文件实现协议2、.m中设置委托3、.m实现协议方法 //点击alert身上的按钮的时候会调用此方法,并且会传参数 //switch创建对象的时候必须要加{},否则会编译不通过 //表示要实现协议,必须实现方法(什么也不写的情况下,默认是@required) @required -(void)doSomething:(NSString *)str; //表示要实现协议,可以实现也可以不实现方法 @optional -(void)doSomething2; 类相互交叉//告诉系统Man是一个类,此时用到Man不要再报错了,但是是不知道这个类有什么属性,和什么方法的 @class Man; //又因为.m中要用到属性和方法,所以仅仅用@class不行,再在.m中导入一下#import "Man.h" #import "Man.h" // MyView*vi=[[MyView alloc]initWithFrame:CGRectMake(<#CGFloat x#>, <#CGFloat y#>, <#CGFloat width#>, <#CGFloat height#>)] NSLog(@"111111"); //系统的init方法会去调用initwithFrame方法,此时的frame是0,0,0,0,所以无法确定按钮的位置 // MyView *vi=[[MyView alloc]init]; // MyView *vi=[[MyView alloc]initWithFrame:CGRectMake(0, 0, 0, 0)]; /* 1.找到应用程序的委托对象,这个对象的window就是手机屏幕上显示的window ZYAppDelegate *app=[UIApplication sharedApplication].delegate; app.window.rootViewController=reg; 2.因为委托对象的window是应用程序的主窗口,所以我们通过应用程序的对象调用keyWindow也可以找到手机屏幕上显示的widow [UIApplication sharedApplication].keyWindow.rootViewController=reg; */ 7T5A59~4UDE99@OU)WN0T`6.jpg ¬ //延时函数,调用refreash方法,传递参数,让这个方法在0.1秒以后调用 [self performSelector:@selector(refreash:) withObject:pickerView afterDelay:.1]; //只要控制器的视图将要显示都会执行此方法,所以这个方法不止执行一次 -(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:YES]; } -(void)viewDidDisappear:(BOOL)animated{ [super viewWillAppear:YES]; } //这2个方法都是不止执行一次 pickerView //设置pickerView分为几个区,此方法有一个参数,即设置的pickView - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ NSLog(@"分区%d",pickerView.tag); //返回值是设置一共多少个区的 return 2; } //设置pickerView每个区分多少行,此方法有两个参数,分别为设置的哪个pickView和要设置的是哪个区 - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{ NSLog(@"分行%d",pickerView.tag); if(component==0){ //返回值设置每个区的行数 return [_leftArr count]; } return [_rightArr count]; } //设置哪个pickView的哪个区的哪一行是什么标题, - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ if(component==0){ //返回值设置每个行显示的内容 return [_leftArr objectAtIndex:row]; } return [_rightArr objectAtIndex:row]; } /当选中pickView某个区的某一行的时候会调用,第一个参数表示当前选择的是哪个pickView,第二个参数表示选择的是哪一行,第三个参数表示的是选择的哪一个区 - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{ NSString *leftStr=nil; NSString *rightStr=nil; if(component==0){ leftStr=[_leftArr objectAtIndex:row]; int rightRow=[pickerView selectedRowInComponent:1]; rightStr=[_rightArr objectAtIndex:rightRow]; }else{ rightStr=[_rightArr objectAtIndex:row]; int leftRow=[pickerView selectedRowInComponent:0]; leftStr=[_leftArr objectAtIndex:leftRow]; } NSString *message=[NSString stringWithFormat:@"左边为:%@,右边为%@",leftStr,rightStr]; [[[UIAlertView alloc] initWithTitle:@"提示" message:message delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:nil] show];CocoaLigature1 - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{ if(component==0){ //延时函数,调用refreash方法,传递参数,让这个方法在0.1秒以后调用 [self performSelector:@selector(refreash:) withObject:pickerView afterDelay:.1]; } } -(void)refreash:(UIPickerView *)pickerView{ [pickerView reloadComponent:1]; //加载每行相对应的行里的内容 [pickerView selectRow:0 inComponent:1 animated:YES]; }CocoaLigature1 UIDatePicker //UIDatePicker是处理时间的一个控件,继承于UIControl ,UIPickView继承于UIView,两者没有直接联系 UIDatePicker *pick=[[UIDatePicker alloc]initWithFrame:CGRectMake(0, 0, 320, 240)]; pick.tag=98; //控件的4种样式 pick.datePickerMode=UIDatePickerModeDateAndTime; //[NSDate date]获取当前日期 //pick.minimumDate=[NSDate date]; //显示多久以后的日期 pick.minimumDate=[NSDate dateWithTimeInterval:5*60*60 sinceDate:[NSDate date]]; [pick addTarget:self action:@selector(getTime:) forControlEvents:UIControlEventValueChanged]; [self.view addSubview:pick]; } -(void)getTime:(UIDatePicker *)pick{ NSDate *date=[pick date]; //格式化日期类,用这个类将nsdate转换成nsstring,也可以按反向转换 NSDateFormatter *formater=[[NSDateFormatter alloc]init]; //设置上午下午标示符,默认是上午和下午 [formater setAMSymbol:@"morning"]; [formater setPMSymbol:@"evening"]; //yyyy表示年 MM表示月 dd表示日 eeee表示星期几 HH表示24时制得小时,hh表示12时制得小时,mm表示分钟,ss表示秒 a表示上午下午 [formater setDateFormat:@"yyyy年MM月dd日 eeee hh:mm:ss a"]; NSString *str=[formater stringFromDate:date]; NSLog(@"%@",str); } -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ NSString *str=@"2015年06月10日 08:53:52"; NSDateFormatter *formater=[[NSDateFormatter alloc]init]; [formater setDateFormat:@"yyyy年MM月dd日 hh:mm:ss"]; ((UIDatePicker *)[self.view viewWithTag:98]).date=[formater dateFromString:str]; ck];CocoaLigature1 UIScrollView //设置内容大小 sc.contentSize=CGSizeMake(200*8, 200); //设置成单页滑动 sc.pagingEnabled=YES; //设置内容偏移量 sc.contentOffset=CGPointMake(200, 0); //设置水平滚动条是否显示 sc.showsHorizontalScrollIndicator=NO; //设置垂直滚动条是否显示 sc.showsVerticalScrollIndicator=NO; //因为此时我们没有用手拨动,所以这个方法不会调用 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ NSLog(@"1111"); int num= scrollView.contentOffset.x/200; UIPageControl *page=(UIPageControl *)[self.view viewWithTag:2]; page.currentPage=num; } //只要scrollView发生偏移就会调用 - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ _pageControl.currentPage=_topView.contentOffset.x/320; } // self.automaticallyAdjustsScrollViewInsets=NO; //因为当前的控制器在导航器中,又在这个控制器的view身上先放的是UIScrollView,就会导致所有放在这个UIScrollView身上的空间向下偏移 //两种解决方法:1、不先放置这个UIScrollView //2、将控制器的automaticallyAdjustsScrollViewInsets这个属性设置成NO UIPageControl //设置page有多少页 page.numberOfPages=8; //设置page的当前页,索引从0开始 page.currentPage=1; //设置点的颜色 page.pageIndicatorTintColor=[UIColor redColor]; //设置当前页的点对应的颜色 -(void)change:(UIPageControl *)page{ int num=page.currentPage; UIScrollView *sc=(UIScrollView *)[self.view viewWithTag:1]; //sc.contentOffset=CGPointMake(200*num, 0); [sc setContentOffset:CGPointMake(200*num, 0) animated:YES]; } 导航栏 //压栈,出栈 ZYOneViewController *one=[[ZYOneViewController alloc]init]; //创建一个导航器,并且指定他的根控制器 //导航栏高度44 UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:one]; self.window.rootViewController=nav;CocoaLigature1 //这是控制器的属性,对这个属性赋值,并不会影响导航器的所有返回按钮,只是代表,当这个控制器在导航器中显示的时候,导航栏上的项目 self.navigationItem.leftBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"回去" style:UIBarButtonItemStyleBordered target:self action:@selector(goBack)]; 模态跳转 -(void)gotoNext{ ZYThreeViewController *three=[[ZYThreeViewController alloc]init]; //设置翻转动画,是枚举类型 three.modalTransitionStyle=UIModalTransitionStyleFlipHorizontal; //控制器与控制器之间跳转,模态跳转 [self presentViewController:three animated:YES completion:nil]; } - (IBAction)goBack:(UIButton *)sender { [self dismissViewControllerAnimated:YES completion:nil]; } //a模态b(a和b都不在导航其中)那么 //a的presentedViewController就是b //b的presentingViewController就是a UIWebView _web=[[UIWebView alloc]initWithFrame:CGRectMake(0, 74, 320, 430-44)]; //设置自适应大小 _web.scalesPageToFit=YES; [self.view addSubview:_web]; [_web loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:_urlArr[num-1]]]]; NSDictionary 字典 NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys:btn.titleLabel.font,NSFontAttributeName, nil]; float width= [_titleArr[num-1] sizeWithAttributes:dic].width; UITableView 用TableViewController创建 //注册单元格,表示此单元格可以被重复使用 [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"]; tab=[[UITableView alloc]initWithFrame:self.view.bounds style:UITableViewStylePlain]; 用ViewController创建 _tab.delegate=self; _tab.dataSource=self; //设置单元格点击状态为无 cell.selectionStyle = UITableViewCellSelectionStyleNone; //设置单元格的样式为无 _tab.separatorStyle = UITableViewCellSeparatorStyleNone; //设置单元格的行高,在此设置会导致所有的行高都为80 _tab.rowHeight=80; [self.view addSubview:_tab]; //方法的返回值就是设置这个表有多少个区的,默认是1个区 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ return 2; } //设置特定的行高,当两者都设置时,以此为准 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ return 40; } //设置某个区的行数,方法有两个参数,第一个参数就是设置委托的表,第二个参数就是要设置的是哪个区,此方法的返回值表示要设置这个区的行数 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return 5*(section+1); } //设置区头标题 -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{ return [NSString stringWithFormat:@"第%d区",section]; } //设置区头的高 -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{ return 30; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ //设置一个重用标示符 static NSString *cellIndentifier=@"cell"; //每次代码执行的时候先从tableView的重用队列里面去寻找有没有可以重复使用的单元格 UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIndentifier]; //如果没有找到可以重用的单元格,那么就去创建单元格 if(!cell){ cell=[[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIndentifier]autorelease]; //把每个单元格共有的东西放在此处 cell.detailTextLabel.text=@"你好"; cell.imageView.image=[UIImage imageNamed:@"c_item0.jpg"]; //按钮样式 cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator; //设置单元格选择样式 cell.selectionStyle=UITableViewCellSelectionStyleNone; } //把每个单元格不同的东西放在此处 cell.textLabel.text=[NSString stringWithFormat:@"第%d区,第%d行",indexPath.section,indexPath.row]; return cell; } xib //获取资源目录,加载xib文件,返回值类型为数组,数组中存放的是xib中除了fileOwner 和firstResponder以外的控件 cell= [[NSBundle mainBundle] loadNibNamed:@"ZYMyTwoTableViewCell" owner:nil options:nil][0]; MyTableViewCell *cell=(MyTableViewCell *)btn.superview.superview.superview; //通过单元格找到其对应的indexPath对象 NSIndexPath *indexPath=[_tab indexPathForCell:cell]; 分线程 //开启一个线程调用当前对象的update2方法,不传参数,当update2方法执行完成后分线程就结束了 [NSThread detachNewThreadSelector:@selector(update2) toTarget:self withObject:nil]; //因为分线程中不能直接改变UI,所以要从分线程中调到主线程去修改UI //回到主线程去执行其refreshUI这个方法,yes表示先阻碍当前的分线程,等到主线程的refreshUI这个方法执行完成后,回到分线程 //NO表示不等到主线程完成后才回来 [self performSelectorOnMainThread:@selector(refreshUI) withObject:nil waitUntilDone:YES]; 有时候配合延迟函数使用 [NSThread sleepForTimeInterval:.05];
液晶面板是一种常见的显示技术,其制造过程中涉及到液晶面板cell的制程。 液晶面板cell制程是指在制造液晶面板时,对液晶层和电极层进行加工、组装等步骤的过程。液晶面板cell制程通常包括以下几个关键步骤: 1. 基板准备:首先,需要准备基板。基板可以是玻璃或塑料等材料,通常是均匀透明的。基板的质量和表面平整度对液晶的显示效果至关重要。所以在此步骤中,需要对基板进行清洁、抛光和检查等工序。 2. 涂层和图案化:接下来,涂层和图案化是关键步骤之一。在这一步骤中,会在基板上涂覆对液晶上层和下层结构起作用的材料,如透明导电膜、垂直切向薄膜等。然后使用光刻技术,为液晶层和电极层制作出复杂的图案和结构。 3. 液晶填充:液晶填充是液晶面板制程的关键步骤之一。在该步骤中,经过特殊的方法将液晶物质填充到两个基板之间的空隙中,形成液晶层。液晶的填充和排列状态直接影响到显示效果的质量。 4. 密封和封装:在液晶填充完成后,需要对液晶层进行密封,以保证其稳定性和长期的使用寿命。常用的密封方法有热熔密封和粘结密封等。 5. 检测和装配:最后,对制造好的液晶面板进行检测和装配。通过各种测试和检查,确保液晶面板的质量符合要求。然后将液晶面板组装到显示设备里,使之能正常工作。 总的来说,液晶面板cell制程是一个复杂的工艺过程,需要高度精密的设备和技术。通过各个步骤的组合和控制,可以制造出高质量的液晶面板,广泛应用于电视、电脑显示器、智能手机等各种电子设备中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值