1 摘要
主要介绍uiscrollview的基本知识。
2 基本使用
- 作用
UIScrollView可以用于显示多于一个屏幕的内容,超出屏幕范围的内容可以通过滑动进行查看 - 常见属性
CGSize contentSize :设置UIScrollView的滚动范围
CGPoint contentOffset :UIScrollView当前滚动的位置
UIEdgeInsets contentInset :这个属性可以在四周增加滚动范围 - 其他属性
BOOL bounces 是否有弹簧效果
BOOL scrollEnabled 是否能滚动
BOOL showsHorizontalScrollIndicator 是否显示水平方向的滚动条
BOOL showsVerticalScrollIndicator 是否显示垂直方向的滚动条
UIScrollViewIndicatorStyle indicatorStyle 设定滚动条的样式
BOOL dragging 是否正在被拖拽
BOOL tracking 当touch后还没有拖动的时候值是YES,否则NO
BOOL decelerating 是否正在减速
BOOL zooming 是否正在缩放 - 手势缩放
设置UIScrollView的id delegate代理对象
设置minimumZoomScale :缩小的最小比例
设置maximumZoomScale :放大的最大比例
让代理对象实现下面的方法,返回需要缩放的视图控件
- (UIView )viewForZoomingInScrollView:(UIScrollView )scrollView
跟缩放相关的常用方法还有
正在缩放的时候调用
-(void)scrollViewDidZoom:(UIScrollView *)scrollView
缩放完毕的时候调用
-(void)scrollViewDidEndZooming:(UIScrollView )scrollView withView:(UIView )view atScale:(float)scale
- (UIView )viewForZoomingInScrollView:(UIScrollView )scrollView
3 实例代码
#import "ViewController.h"
#pragma mark 重点1:此处没有遵守协议,但是缩放操作依然可以进行,是不是该版本软件自动实现了。
区别就是,遵守协议的话,写方法的时候会有提示方法名字,不写的话,没有提示,但是因为方法的实现是存在的,所以可以调用。
此处的遵守协议放在头文件也可以,此处的<>遵守协议后,就实现了包含协议方法声明的作用,而自定义的代理模式里面,仅仅这样<>遵守达不到那样的效果,要间接或者直接包含才可以。
@interface ViewController ()<UIScrollViewDelegate>
{
UIImageView *_imageView;
UIScrollView *_scrollView;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIImage *image = [UIImage imageNamed:@"big.jpg"];
CGFloat imgH = image.size.height;
CGFloat imgW = image.size.width;
NSLog(@"imghw %f %f", imgH, imgW);
_scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 20, 250, 250)];
_scrollView.contentSize = CGSizeMake(imgW, imgH);
_scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
// scrollView.bounces = NO;
#pragma mark 重点2:scrollview的代理属性。
_scrollView.delegate = self;
_scrollView.maximumZoomScale = 2;
_scrollView.minimumZoomScale = 0.1;
_scrollView.backgroundColor = [UIColor redColor];
//将scrollview添加到view中。
[self.view addSubview:_scrollView];
#pragma mark 注意点1:这样设置的imageview其尺寸自动为图片的尺寸,相当于下面的代码。
_imageView = [[ UIImageView alloc] initWithImage:image];
// UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, imgW, imgH)];
// imageView.image = image;
#pragma mark 注意点2:放在这是为了体会,imageview的原点还是插入之前的原点。
_scrollView.contentInset = UIEdgeInsetsMake(10, 20, 40, 30);
[_scrollView addSubview:_imageView];
}
#pragma mark 重点3:实现代理的缩放方法。
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return _imageView;
}
- (IBAction)bottomMove:(UIButton *)sender {
float x = 20;
CGFloat y = 30;
NSLog(@"y=%f x = %f",y,x);
NSLog(@"%f %f", _scrollView.contentOffset.x, _scrollView.contentOffset.y);
CGPoint temp = _scrollView.contentOffset;
temp.y += 20;
#pragma mark 注意点3:该属性的值不受contentsize的限制
_scrollView.contentOffset =temp;
NSLog(@"%f %f", _scrollView.contentOffset.x, _scrollView.contentOffset.y);
}
@end
4 重点 难点 注意点
- 所用的Xcode6.4中,代理在没有遵守协议的情况下,依然可以实现协议的方法。区别就是,在写方法的时候没有同步提示名字,但因为方法的实现存在,所以还是可以调用方法的。
- 利用initwithimage设置uiimageview的iamge属性时,它的尺寸默认是图的尺寸。
- contentinsert方法,不影响uiscrollview的原点,图片还是在原来的原点位置。
- contentoffset方法,其值不受contentsize的约束。
- 打印cgfloat和float类型的变量,如果用%d的话,结果为0。
- 一般在系统自带的类的声明中,用@Package修饰的变量,仅供类内部使用,是私有的,不能在类外面调用,不算类的属性。
5 疑问
- 为什么contentoffset不收contentsize的约束?
- 缩放中,没有遵化协议也是可以操作的,和自定义的代理设计不同,而且其遵守协议就相当于包含了协议中的方法,和自定义的代理设计也是不同的????