</pre> UIButton -->UIControl-->UIVIew<p></p><p> UILabel--->UIView</p><p>UIImageView-->UIView</p><p>UITextField -->UIView</p><p>UIControl可以交互,它具有以下属性和方法:</p><p></p><pre code_snippet_id="635768" snippet_file_name="blog_20150404_2_9506459" name="code" class="objc"> 1.1 设置控件的状态 启用、禁用 @property(nonatomic,getter=isEnabled) BOOL enabled; 选中、不选中 @property(nonatomic,getter=isSelected) BOOL selected; 高亮或者不高亮 @property(nonatomic,getter=isHighlighted) BOOL highlighted; 1.2 设置控件内容的布局 垂直居中方向 @property(nonatomic) UIControlContentVerticalAlignment contentVerticalAlignment; 水平居中方向 @property(nonatomic) UIControlContentHorizontalAlignment contentHorizontalAlignment; 1.3 添加/删除监听方法 - (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents; - (void)removeTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
//将监听方法,注册到“”运行循环“”,当按钮被点击以后,运行循环通知视图控制器执行@selector的方法
btn addTarget :self action @selector
代理的用处?
监听那些不能通过addTarget监听的事件!
主要用来负责在两个对象之间,发生某些事件时,来传递消息或者数据
2> 代理的实现步骤
(1) 成为(子)控件的代理,父亲(控制器)成为儿子(文本框)的代理
(2) 遵守协议->利用智能提示,快速编写代码
(3) 实现协议方法
UIScrollView相关:
// 告诉scrollView内部内容的实际大小
self.scrollView.contentSize = image.size;
没有设置contentSize scrollEnabled=NO 没有接收到触摸事件:userInteractionEnabled=NO 没有取消autolayout功能(如果在Storyboard中添加了ScrollView的子控件,要想scrollView滚动,必须取消autolayout)content Inset:设置边距(相当于padding)
self.scrollView.contentInset = UIEdgeInsetsMake(20, 20, 20, 20);
// 不显示水平滚动标示
self.scrollView.showsHorizontalScrollIndicator = NO;
// 不显示垂直滚动标示
self.scrollView.showsVerticalScrollIndicator = NO;
// *** 偏移位置
self.scrollView.contentOffset = CGPointMake(0, -100)
// 取消弹簧效果,内容固定,不希望出现弹簧效果时
// 不要跟bounds属性搞混了
self.scrollView.bounces = NO;
// 让图像视图根据图像自动调整大小,而不用frame把宽高写死
[self.imageView sizeToFit];
自动布局:
苹果为了程序员能够将注意力集中在程序上,而不要在代码中过多的使用frame
“参照”任何一个控件,都可以参照另外一个控件定义出准确的位置
xcode复制控件:按着option,然后鼠标拖动。然后先后松开署标和option键。
strong 与 weak的区别:
/** ARC中dealloc主要用于调试,判断对象是否被释放 */ - (void)dealloc { NSLog(@"Person对象被释放"); } 在OC中如果对象没有强引用,会被立即释, 默认的对象,都是强引用的 __weak 表示弱引用,如: __weak Person *p = [[Person alloc] init] 表示对象赋值以后就会被释放 当向数组里面存的时候,会自动强引用; 一般只有一个对象进行强引用即可,否则内存可能泄漏 对象的属性声明方式: 如果用stroyboard拖线,控件用weak,如果用代码创建界面,控件用strong,自定义对象需要使用strong,NSString需要使用copy,数字型(如int),使用assing
加载xib时要注意,返回的究竟是不是View对象(一般xib放一个根view对象,从而可以保证能正确返回)。
可以用xib添加手势识别器(UITapGestureRecognizer),然后在xib里面向代码里面连线添加监听方法
使用xib加载控件时抛出如下异常: // -[UITapGestureRecognizer superview]: unrecognized selector sent to instance 0x8e407a0 // 分析: <pre name="code" class="objc">superview方法属于谁:UIView // 结论: // 错误将UITapGestureRecognizer当做UIView来使用(从xib中加载的不是UIView而是UITapGestureRecognizer) 解决方法: NSArray *objs = [[NSBundle mainBundle] loadNibNamed:@"HMToolbar" owner:nil options:nil]; [objs lastObject];//必须知道返回的是view对象xib错误二(注意xib名称): load the "xxx" nib but the view outlet was not set问题分析:
HMHomeViewController *homeVc = [[HMHomeViewController alloc] init]; //默认会尝试去找HMHomeView.xib,如果没有会尝试去找与控制器同名(HMHomeViewController.xib)的xib,如果找不到,则自己创建 homeVc.view.backgroundColor = [UIColor redColor]; homeVc.title = @"首页界面"; [self.navigationController pushViewController:homeVc animated:YES]; // 控制器默认会自动找对应的xib来创建view // 1.去掉Controller这个单词后的同名的xib:HMHomeView.xib // 2.完全同名的xib:HMHomeViewController.xib 解决方法: 1,在xib中设置files owner 2,xib名字不要与控制器前缀相同一般修改了xib存在缓存:在模拟器将项目删除掉,然后清理工程(product-->clear)
自定义表格行:
XIB的定义步骤 1> 新建HMTgCell.xib(com+N-->empty) //单元格类名相同 2> 拽一个需要自定义的控件,摆放其他子控件 3> 新建一个类 * <span style="color:#FF0000;">类名要与XIB的名字保持一致</span> * <span style="color:#FF0000;">继承自的子类要与XIB中的根节点的类型一致</span> 4> <span style="color:#FF0000;"><strong>要连线之前,需要将XIB的根节点类名(custom class)修改为刚刚新建的类名,否则不能自动关联(Automatic)</strong></span> 5> 连线 6> 在XIB的属性面板,指定可重用标示符(identifiter),否则表格行不能重用 利用xib加载cell: <pre name="code" class="objc">// 1. 可重用标示符 static NSString *ID = @"Cell"; //这里的Cell要与XIB的属性面板中指定重用标示符相同,否则不能重用 // 2. tableView查询可重用Cell HMTgCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; // 3. 如果没有可重用cell if (cell == nil) { // cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID]; // 从XIB加载自定义视图 cell = [[[NSBundle mainBundle] loadNibNamed:@"HMTgCell" owner:nil options:nil] lastObject]; }代码创建Cell的步骤
1,新建一个类继承自:UICollectionViewController
2,在.m文件实现代理方法:
// 返回有多少组 - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { return 1; } //共有多少个cell - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return self.products.count; } // 返回每一个cell长什么样 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { <pre name="code" class="objc"> UICollectionViewCell *cell = [collectionView <span style="color:#FF0000;">dequeue</span>ReusableCellWithReuseIdentifier:ID forIndexPath:indexPath]; .... return cell; } - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { ILProduct *p = self.products[indexPath.item]; NSLog(@"点击了---%@",p.title); } 3,注册UICollectionViewCell: - (void)viewDidLoad { [super viewDidLoad]; // 注册UICollectionViewCell,如果没有从缓存池找到,就会自动帮我们创建UICollectionViewCell UINib *xib = [UINib nibWithNibName:@"ILProductCell" bundle:nil]; [self.collectionView registerNib:xib forCellWithReuseIdentifier:ID]; // [self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:ID]; self.collectionView.backgroundColor = [UIColor whiteColor]; } 4,<span style="color:#FF0000;">实例化UICollectionView需要指定一个布局</span>(流水布局): 方法一直接实例化: UIXXXXCollectionView alloc] initWithColllectionViewLayout:<span style="color:#FF0000;">UICollectionViewFlowLayout</span>] 方法二重写控制器的init方法: - (id)init { // 创建流水布局 UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; // 每一个cell的尺寸 layout.itemSize = CGSizeMake(80, 80); // 垂直间距 layout.minimumLineSpacing = 10; // 水平间距 layout.minimumInteritemSpacing = 0; // 内边距(padding) layout.sectionInset = UIEdgeInsetsMake(10, 0, 0, 0); return [super initWithCollectionViewLayout:layout]; } 关键点: <span style="color:#FF0000;"> 实现代理方法;必须有布局;cell必须自己注册</span>ios快速解析JSON: