您的位置:首页 > 产品设计 > UI/UE

IOS开发基础—uiscrollview的基本使用

2015-05-12 14:46 399 查看

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

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的约束?

缩放中,没有遵化协议也是可以操作的,和自定义的代理设计不同,而且其遵守协议就相当于包含了协议中的方法,和自定义的代理设计也是不同的????
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: