黑马程序员_iOS 的高级控件之UIScrollView

iOS,Android,Java培训,期待与您的交流
iOS应用开发的一项内容就是用户界面的开发。不管应用程序实际包含的逻辑有多复杂,如果这个应用程序没有提供友好的图形用户界面,将很难吸引用户。作为一个程序设计者,必须优先考虑用户的感受,一定要让用户感到爽,这个应用程序才有价值。
1    UIScrollView的基本概念
UIScrollView代表一个可滚动的控件,该控件允许用户拖动手指来滚动控件中的内容。通过滚动控件的支持,UIScrollView可以显示超过一个屏幕的内容。
UIScrollView支持如下的三个属性。
1、contentSize:该属性是CGSize类型,代表UIScrollView所需要显示内容的完整宽度和高度
2、contentInset:该属性是UIEdgeInsets类型,它是一个结构体,包含top、left、bottom、right四个成员变量,用于设置四个方向上,滚动条区域的大小
3、contentOffset:该属性是CGPoint类型,表示UIScrollView在显示内容上滚动的位置
  
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // 1.创建UIScrollView
    UIScrollView *scrollView = [[UIScrollView alloc] init];
    scrollView.frame = CGRectMake(0, 0, 250, 250); // frame中的size指UIScrollView的可视范围
    scrollView.backgroundColor = [UIColor grayColor];
    [self.view addSubview:scrollView];
    
    // 2.创建UIImageView(图片)
    UIImageView *imageView = [[UIImageView alloc] init];
    imageView.image = [UIImage imageNamed:@"big.jpg"];
    CGFloat imgW = imageView.image.size.width; // 图片的宽度,1366
    CGFloat imgH = imageView.image.size.height; // 图片的高度,768
    imageView.frame = CGRectMake(0, 0, imgW, imgH);
    [scrollView addSubview:imageView];
    
    // 3.设置scrollView的属性
    
    // 设置UIScrollView的滚动范围(内容大小),如果滚动区域小于imageView的frame,则只能看到一部分图片
    scrollView.contentSize = imageView.image.size;
//    scrollView.contentSize = CGSizeMake(320, 480);
    
    // 隐藏水平滚动条
    scrollView.showsHorizontalScrollIndicator = NO;
    scrollView.showsVerticalScrollIndicator = NO;
    
    // 用来记录scrollview滚动的位置,指的是scrollview的frame左上角顶点在滚动范围的座标,滚动范围的原点也是左上角,并且不受滚动条区域的影响(contentInset属性)
//    scrollView.contentOffset = ;
    
    // 去掉弹簧效果
//    scrollView.bounces = NO;
    
    // 控制滚动条的区域大小,不影响contentSize的大小,可以理解为是在contenSize的基础上向外扩展
    // top  left  bottom  right,不影响可视范围的大小,在可视范围截取一部分
    scrollView.contentInset = UIEdgeInsetsMake(100, 20, 20, 20);
    
    _scrollView = scrollView;
}

2    UIScrollView的缩放功能
通过手势,能够缩放UIScrollView里的内容。这个功能是通过代理模式实现,代理对象应该实现协议UISCrollViewDelegate的一个方法。
1、- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView,返回需要缩放的视图控件
其他可以实现的方法。
2、-(void)scrollViewDidZoom:(UIScrollView *)scrollView,正在缩放的时候调用
3、-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale,缩放完毕的时候调用
  

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // 1.添加UIScrollView
    UIScrollView *scrollView = [[UIScrollView alloc] init];
//    scrollView.frame = CGRectMake(0, 0, 320, 460);
    scrollView.frame = self.view.bounds;
    [self.view addSubview:scrollView];
    
    // 2.添加图片
    UIImage *image = [UIImage imageNamed:@"big.jpg"];
    // 调用initWithImage:方法创建出来的UIImageView,它的宽高默认跟图片的宽高一样
    _imageView = [[UIImageView alloc] initWithImage:image];
//    // 设置图片
//    imageView.image = [UIImage imageNamed:@"big.jpg"];
//    
//    // 设置frame
//    imageView.frame = CGRectMake(0, 0, imageView.image.size.width, imageView.image.size.height);
    [scrollView addSubview:_imageView];
    
    // 设置内容范围
    scrollView.contentSize = image.size;
    
    // 设置scrollview的代理对象
    scrollView.delegate = self;
    
    // 设置最大伸缩比例
    scrollView.maximumZoomScale = 2.0;
    // 设置最小伸缩比例
    scrollView.minimumZoomScale = 0.2;
}

//ScrollView实现图片缩放功能:只能缩放它内部的控件,只需告诉ScrollView缩放哪个控件

#pragma mark - UIScrollView 的 代理方法
#pragma mark 这个方法返回的控件就能进行捏合手势缩放操作
#pragma mark 当UIScrollView尝试进行缩放的时候就会调用
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return _imageView;
}

#pragma mark 当缩放完毕的时候调用
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
{
//    NSLog(@"结束缩放 - %f", scale);
}

#pragma mark 当正在缩放的时候调用
- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{
//    NSLog(@"-----");
}

3    UIScrollView的分页功能
UIScrollView的分页功能,一般都会和UIPageControl一起实现。UIPageControl由N个小圆点组成,每个原点代表一个页面,当前页面以高亮的原点显示。UIPageControl的常见属性。
NSInteger numberOfPages : 总页数
NSInteger currentPage : 当前的页码
BOOL hidesForSinglePage : 当只有一页的时候,是否要隐藏视图
UIScrollView的分页效果只需要设置pagingEnabled=YES
  
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    CGFloat w = self.view.frame.size.width;
    CGFloat h = self.view.frame.size.height;
    for (int i = 0; i< kCount; i++) {
        UIImageView *imageView = [[UIImageView alloc] init];
        
        // 1.设置frame
        imageView.frame = CGRectMake(i * w, 0, w, h);
        
        // 2.设置图片
        NSString *imgName = [NSString stringWithFormat:@"0%d.jpg", i + 1];
        imageView.image = [UIImage imageNamed:imgName];
        
        [_scrollView addSubview:imageView];
    }
    
    // height == 0 代表 禁止垂直方向滚动
    _scrollView.contentSize = CGSizeMake(kCount * w, 0);
    _scrollView.showsHorizontalScrollIndicator = NO;
    _scrollView.pagingEnabled = YES;  //用scrollView的Frame进行分页
    _scrollView.delegate = self;
    
    // 添加PageControl
    UIPageControl *pageControl = [[UIPageControl alloc] init];
    pageControl.center = CGPointMake(w * 0.5, h - 20);
    pageControl.bounds = CGRectMake(0, 0, 150, 50);
    pageControl.numberOfPages = kCount; // 一共显示多少个圆点(多少页)
    // 设置非选中页的圆点颜色
    pageControl.pageIndicatorTintColor = [UIColor redColor];
    // 设置选中页的圆点颜色
    pageControl.currentPageIndicatorTintColor = [UIColor blueColor];
    
    // 禁止默认的点击功能
    pageControl.enabled = NO;
    
    [self.view addSubview:pageControl];
    _pageControl = pageControl;
}

#pragma mark - UIScrollView的代理方法
#pragma mark 当scrollView正在滚动的时候调用
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    int page = scrollView.contentOffset.x / scrollView.frame.size.width;
//    NSLog(@"%d", page);
    
    // 设置页码
    _pageControl.currentPage = page;
}

iOS,Android,Java培训,期待与您的交流
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章