initWithFrame和initWithCoder使用技巧,以及他们什么时候被调用,自定义控件必须具备三个方法initWithFrame和initWithCoder以及drawRect

//
//  MJLockView.m
//  03-手势解锁
//
//  Created by apple on 14-4-20.
//  Copyright (c) 2014年 itcast. All rights reserved.
//

#import "MJLockView.h"

@implementation MJLockView
//当你通过代码创建控件就会调用这个方法
- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self setup];
    }
    return self;
}
//当你通过storyboared或者xib中创建控件就会调用这个方法
- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super initWithCoder:aDecoder]) {
        [self setup];
    }
    return self;
}

/**
 初始化
 */
- (void)setup
{
    for (int index = 0; index<9; index++) {
        // 创建按钮
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        
        btn.userInteractionEnabled = NO;
        
        btn.backgroundColor = [UIColor blueColor];
        
        // 设置默认的背景图片
        [btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];
        
        // 设置选中时的背景图片(selected)
        [btn setBackgroundImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateSelected];
        
        // 添加按钮
        [self addSubview:btn];
    }
}

// 调整按钮的frame最好在这个方法里面
- (void)layoutSubviews
{
    [super layoutSubviews];
    
    for (int index = 0; index<self.subviews.count; index++) {
        // 取出按钮
        UIButton *btn = self.subviews[index];
        
        // 设置frame
        CGFloat btnW = 74;
        CGFloat btnH = 74;
        
        int totalColumns = 3;
        int col = index % totalColumns;
        int row = index / totalColumns;
        CGFloat marginX = (self.frame.size.width - totalColumns * btnW) / (totalColumns + 1);
        CGFloat marginY = marginX;
        
        CGFloat btnX = marginX + col * (btnW + marginX);
        CGFloat btnY = row * (btnH + marginY);
        btn.frame = CGRectMake(btnX, btnY, btnW, btnH);
    }
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint pos = [touch locationInView:touch.view];
    
    for (UIButton *btn in self.subviews) {
        if (CGRectContainsPoint(btn.frame, pos)) {
            btn.selected = YES;
        }
    }
    
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint pos = [touch locationInView:touch.view];
    
    for (UIButton *btn in self.subviews) {
        if (CGRectContainsPoint(btn.frame, pos)) {
            btn.selected = YES;
        }
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{

}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self touchesEnded:touches withEvent:event];
}

- (void)drawRect:(CGRect)rect
{
    
}

@end

时间: 2024-11-10 01:05:57

initWithFrame和initWithCoder使用技巧,以及他们什么时候被调用,自定义控件必须具备三个方法initWithFrame和initWithCoder以及drawRect的相关文章

uiview的初始化方法—initwithframe

简单的说,我们用编程方式申明,创建UIView对象时,使用initWithFrame方法. 在此,我们必须搞清楚,两种方式来进行初始化UIView. 1.使用 Interface Builder 方式. 这种方式,就是使用nib文件.通常我们说的"拖控件" 的方式. 实际编程中,我们如果用Interface Builder 方式创建了UIView对象.(也就是,用拖控件的方式) 那么,initWithFrame方法方法是不会被调用的.因为nib文件已经知道如何初始化该View.(因为,

mmg摆脱冰球突破2019最新技巧攻略,你离五个冰球只差三步

mg摆脱,又名为mg冰球突破是一款来自韩国的小游戏,[官网:254841.C0M ]游戏上手简单,深受国内广大玩家的喜欢,上线至今,已经拥有了大量的mg摆脱粉丝,是游戏界一款高知名度的休闲小游戏.mg摆脱中最大的在奖项为5个冰球,今天就刚大家说一下这个5个冰球爆分技巧. mg摆脱手机版怎么玩才能曝五个冰球,要注意的有分三个步骤. 1.规划好笨今,相信大多数人都是一样,每次冲值都1--2百这样子,确实笨今最好5百以上为佳,1--2百是坚持到曝分是有点牵强的.2.控制好心态,很多人都是打几下不曝分就

C#(HTML)_小技巧_关于textbox框中不能输入HTML标签的解决方法(如输入“&lt;p&gt;”后,在提交表单时系统会崩溃)

主要修改文件是config文件(Web.config): 1.在<pages>标签中添加属性:validateRequest="false" <pages validateRequest="false"> </pages> 2.在<httpRuntime>标签中添加属性:requestValidationMode="2.0" <httpRuntime  requestValidationMod

LINQ技巧:如何通过多次调用GroupBy实现分组嵌套

问题如上,解决如下,目标在最下面: using System;using System.Linq; namespace ConsoleApplication1{ class Program { public class Sdata { public string gather; public int shotcount; } static void Main(string[] args) { var m = new[]{ new Sdata{gather = "100002",shot

【转】【调试技巧】Linux环境下段错误的产生原因及调试方法小结

本文转自:http://www.cnblogs.com/panfeng412/archive/2011/11/06/segmentation-fault-in-linux.html 最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation Fault).借此机会系统学习了一下,这里对Linux环境下的段错误做个小结,方便以后同类问题的排查与解决. 1. 段错误

javascript技巧篇(1) - javascript实现动态表格的三个重要方法

要实现动态表格,首先需要掌握javascript提供的3个非常重要的方法 (1)使用insertRow()方法添加表格行数.在javascript中增加表格的行,首先需要确定新增行插入表格的位置,然后执行插入操作. var table=document.getElementById("mytable");//取得表格对象 var  index=table.rows.length;//取得表格的行数 var nextRow =table.insertRow(index);//取得新插入行

Qt技巧:QProcess与外部程序的调用

项目做到一定阶段,经常需要在原来的工程上调用外部程序.Qt为此提供了QProcess类,QProcess可用于完成启动外部程序,并与之交互通信. 一.启动外部程序的两种方式: (1)一体式:void QProcess::start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite) 外部程序启动后,将随主程序的退出而退出. (2)分离式:void QProcess::start

运用Runtime全局修改UILabel的默认字体

今天同事项目遇到一个问题,要修改所有UILabel的字体,我查了以下资料,推荐使用runtime机制替换掉UILabel的初始化方法,对label的字体进行默认设置.主要替换以下三个方法initWithFrame.init和xib用到的awakeFromNib,创建UILabel的类别代码如下: .h #import <UIKit/UIKit.h> @interface UILabel (LabelDefaultFont) @end .m #import "UILabel+Label

深入研究java.lang.Object类

一.概述:       Object类是所有Java类的祖先.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法.在不明确给出超类的情况下,Java会自动把Object作为要定义类的超类.      可以使用类型为Object的变量指向任意类型的对象.      Object类有一个默认构造方法pubilc Object(),在构造子类实例时,都会先调用这个默认构造方法.      Object类的变量只能用作各种值的通用持有者.要对他们进行任何专门的操作,都需要知道它