在学习scroll View时遇到一些小零碎的知识点. 其实很多控件本身并没有太多需要说的, 很多资料都介绍的很详细了.
更多的是在学习的过程中体会其中的原理,以及 在这过程中遇到的问题,往往这些看似不起眼的小问题, 能够引起一系列的思考.而这些东西才是最宝贵的.
1.scroll view 控件
我们使用它实现在屏幕上动态的滑动图片,手势控制缩放等等,而这些的实现其实就是对控件内一些属性的控制
self.scrollView.contentSize = CGSizeMake( );
self.scrollView.contentOffset = CGPointMake( );
self.scrollView.contentInset = UIEdgeInsetsMake( );
这三个属性比较重要.
contensize 这个属性是说明要滚动显示的内容尺寸大小. 这个不要和frame弄混, frame是控件本身的大小.
contentoffset这个属性非常重要,对滚动的操作就是对它修改,配合动画效果,就可以实现我们手机上常见的功能,顾名思义它就是偏移量,它控制滚动的内容在控件frame大小的区域内要显示的部分.也就是但我们手势滑动内容时, 其实是在改变它的值.
contentinset 这个属性可以简单的理解为,在frame控件大小区域内,默认显示内容填充边距, 四个方向的是逆时针设置边距的.
这三个属性的赋值方法类型是不同的,contentSize -----> CGSize; contentOffset ----> CGPoint ; contentInset ----> UIEdgeInsets; 具体使用的时候可以参考定义
==============================
2. 代理
详细说一下,代理是一个对象控制另一个对象去帮忙完成某些事情. 是为了增加对象的灵活性 ,独立性的.
对象A中首先要具备做某种事的能力, 如果不具备这种能力,就无法控制另一个对象B去完成某种事情
对象A中还要有能够跟对象B沟通的能力,是与对象B 交互的直接渠道
对象B中要具备做对象A中某种能力下的 具体实施方案
这样对象A就能不亲自去做某些事情,而是由它的能力去控制其他对象,帮他完成即可. 对象A的独立性更高,更轻便.
对象A:
@class AMPerson;
/*凡是遵守协议规范的人,都可以为A提供服务*/
@protocol AMPersonDelagate <NSObject> //定义协议,规范代理人B 要符合 A需求
@optional
- (void) personFindOffer: (AMPerson *) person; //规范 代理人,应该具备的能力, 找工作;还可以根据需求, 增加找房子,找媳妇等等 ==.
@end
@interface AMPerson : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, weak) id <AMPersonDelagate> delegate; //与B能够沟通的渠道
- (void)findOffer; //A 自身应该具备的能力, 工作的能力, 对房子的能力, 处对象的能力 等等 ==.
@end
A的实现部分
#import "AMPerson.h"
@implementation AMPerson
// 实现寻找代理人B 去帮忙完成的操作, 协议已经规范了, 代理人B的能力,所以可以放心委托B去完成A的需求
- (void)findOffer{
NSLog(@"%@", self.name);
if([self.delegate respondsToSelector: @selector(personFindOffer:)]){
[self.delegate personFindOffer: self]; //通过与B的沟通渠道, 让B 去完成服务
}
}
@end
对象B
#import "AMPerson.h"
@interface AMFindOffer : NSObject <AMPersonDelagate> //作为A的委托人, 要能给A提供服务,就必须 遵守A的协议规定
@end
B的实现
@implementation AMFindOffer
/*遵守了A的规定过, 然后帮A 去具体实施 方案*/
- (void) personFindOffer:(AMPerson *)person{
NSLog(@"@联系猎头,递交委托人简历....");
NSLog(@"@找到工作了!");
}
@end
#import <Foundation/Foundation.h>
#import "AMPerson.h"
#import "AMFindOffer.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
AMFindOffer * B = [[AMFindOffer alloc] init];
AMPerson * A = [[AMPerson alloc] init];
A.name = @"zhang san";
A.delegate = B; //取得与代理B的沟通关系
[A findOffer]; //A发出找工作的需求, 具体怎么找, 交给B去完成
}
return 0;
}
在A中要定义一个协议,去规范代理B 应该实现的内容, 协议中的方法可以用 @optional 前缀 说明该方法在实现方面是可选的, 即代理B 可以只具备几个服务, 也可以是仅提供一个服务.
要获得 代理实现的内容, 首先应该具备使用这项内容的能力,即 A本身应该具备一个需求该内容的方法,通过这个方法,去与B沟通,并让B 去完成任务
在B中首先一定要遵守A的协议 , 然后再去实现 应该完成的内容方案...
其实我们也可以通过另一种方式完成上面的操作,只不过 ,不够通用, 不够独立,不够灵活.
我们可以在A中定义一个B类的指针. 在获得了B类后,就可以完成需要的操作.
==============================
3.前面学习中遇到的小问题, 都记录在这里吧
1.当要放大按钮中的图片时候,我们动态修改图片的frame,但图片可能会因为IOS自动布局的原因, 图片不能实现放大, 我们需要修改控制器下的Use Auto Layout属性.
2. 当我们不想让按钮中的图片显示高亮效果的时候 修改 Highlighted Adjusts Image 属性
3. 控件显示顺序问题. (把遮盖层置于放大图片的上面, 不然是最顶层的,) bringSubviewToFront: 这个函数去完成把某个控件放到 父控件的最顶层
4. [coverView addTarget: self action:@selector(smallImageClick) forControlEvents: UIControlEventTouchUpInside]; 为某个控件上的动作注册触发方法
为covervView 控件 上的 点击事件 注册一个samllImageClick方法.
addTarget 参数是smallimageClick方法的对象, 即触发方法的对象.
5. [self.iconView setImage: [UIImage imageNamed:question.icon] forState: UIControlStateNormal]; 对按钮上图片的设置不能直接用 bu.imageview.image
因为按钮是区分状态的, 必须根据状态去设置, 必须使用这个函数,不然 会出现混乱.....
6.
AppIcon是程序的图标, LaunchImage是程序的启动动画背景
在设置启动图的时候,一定要先把其他图片资源添加好后,在这里设置
===================================