UISrollView控件介绍;喜马拉雅UI;代理设计模式;图片缩放以及UIScrollView代理


1、移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也相当有限 

当展示的内容较多,超出一个屏幕时,用户可通过滚动手势来查看屏幕以外的内容 


普通的UIView不具备滚动功能,不能显示过多的内容 


UIScrollView是一个能够滚动的视图控件,可以用来展示大量的内容,并且可以通过滚动查看所有的内容 


举例:手机上的“设置”、


2、


UIScrollView的用法很简单


将需要展示的内容添加到UIScrollView中


设置UIScrollView的contentSize属性,告诉UIScrollView所有内容的尺寸,也就是告诉它滚动的范围(能滚多远,滚到哪里是尽头)

3、UIScrollView无法滚动的解决办法

如果UIScrollView无法滚动,可能是以下原因:


没有设置contentSize


scrollEnabled = NO


没有接收到触摸事件:userInteractionEnabled = NO。不能与用户进行交互


没有取消autolayout功能(要想scrollView滚动,必须取消autolayout)


… …


4、常见三大属性(很重要!!!!!!!!!!!!!!)

@property(nonatomic) CGPoint contentOffset; 


这个属性用来表示UIScrollView滚动的位置


这个位置是一个Point,圆点是在最开始的左上角,而移动之后屏幕左上角的位置就是这个点的位置。 


 



@property(nonatomic) CGSize contentSize; 


这个属性用来表示UIScrollView内容的尺寸,滚动范围(能滚多远)


和frame.size不同,后者代表的是可视范围



 


@property(nonatomic) UIEdgeInsets contentInset; 


这个属性能够在UIScrollView的4周增加额外的滚动区域


相当于滚动之后增加了外边距


在iOS7中很多效果都可以利用这几个属性来完成


喜马拉雅App首页面中的效果:实现顶部的NavigationBar的穿透效果。

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // 设置内容滚动范围
//    CGFloat contentH = self.lastBtn.frame.origin.y + self.lastBtn.frame.size.height+ 10;
    // 10是底部的间距
    CGFloat contentH = CGRectGetMaxY(self.lastBtn.frame) + 10;
    self.scrollView.contentSize = CGSizeMake(0, contentH);
    
    // 增加额外的滚动区域(在顶部增加64的区域,在底部增加44的区域)
    self.scrollView.contentInset = UIEdgeInsetsMake(64, 0, 44, 0);
    
    // 设置一开始的滚动位置(左上角是(0,0),往下滚动64)
    self.scrollView.contentOffset = CGPointMake(0, -64);
}





5、另外几个常见属性:

@property(nonatomic) BOOL bounces;


设置UIScrollView是否需要弹簧效果 



@property(nonatomic,getter=isScrollEnabled) BOOL scrollEnabled; 


设置UIScrollView是否能滚动 



@property(nonatomic) BOOL showsHorizontalScrollIndicator;


是否显示水平滚动条 



@property(nonatomic) BOOL showsVerticalScrollIndicator;


是否显示垂直滚动条 




6、代理详解: 

代理的作用:

监听的思想:让一个对象A监听 另一个对象B的状态。
通知的思想:一个对象B状态发生了改变(做了某些事情),想通知另一个对象B 

什么时候使用代理:
当一个对象(Controller)想监听另一个对象(UI控件)状态的变化时

很多时候,我们想在UIScrollView正在滚动 或 滚动到某个位置 或者 停止滚动 时做一些特定的操作


要想完成上述功能,前提条件就是能够监听到UIScrollView的整个滚动过程


当UIScrollView发生一系列的滚动操作时, 会自动通知它的代理(delegate)对象,给它的代理发送相应的消息,让代理得知它的滚动情况


也就是说,要想监听UIScrollView的滚动过程,就必须先给UIScrollView设置一个代理对象,然后通过代理得知UIScrollView的滚动过程




代理:当代理对象监听到事件发生的时候,scrollView发送特定的消息(OC中,发送消息就是调用方法),调用响应的方法。


那当ScrollView的代理需要具备一个条件,就是要实现这几个特定方法,所以我们将这几个特定方法放到一个协议中去,


告诉ta,想要成为我的代理必须遵守这个协议。 所以说UIScrollView和Delegate沟通的条件是遵循特定的协议!!




UIScrollView将delegate需要实现的方法都定义在了UIScrollViewDelegate协议中,因此要想成为UIScrollView的delegate,


必须遵守UIScrollViewDelegate协议,然后实现协议中相应的方法,就可以监听UIScrollView的滚动过程了。




三个步骤:


设置代理、遵守协议、实现协议中定义的方法




通过上述我们可以知道代理就是对象A监听对象B,A一般是控制器,B一般是控件(当然也可能是控制器)。

实现代理的三个步骤:

1、设置代理:设置监听对象A为代理B.delegate = self(A);

2、遵守协议:遵守的是被监听对象B的协议,所以协议是定义在对象B中的。在对象A中引入代理

3、实现协议方法:在对象A中实现协议中的方法


自定义代理:

现在被监听对象B中定义一个协议,并且定义一个delegate属性

比如AddContacts

//2.数据逆传(把当前控制器view的数据传递到上一个控制器的view中)《查看 pro - 通讯录4》
77     //使用代理,自定义一个代理,并使用代理传递数据
78     //如果代理方法存在就通知代理调用该方法,传递数据
79     if ([self.delegate respondsToSelector:@selector(addViewControllerDidAddBtn:contatc:)]) {
80         NSLog(@"sadafaf");
81         [self.delegate addViewControllerDidAddBtn:self contatc:info];
82     }




7、UIScrollView代理使用介绍

#import "MJViewController.h"

@interface MJViewController () <UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIImageView *minionView;
@end
// 代理 \ 委托

@implementation MJViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // 设置内容尺寸
    self.scrollView.contentSize = self.minionView.frame.size;
    
    // 设置
    self.scrollView.delegate = self;
    
    // 调用 UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView代理方法时候  
    // 需要    设置最大和最小的缩放比例
    self.scrollView.maximumZoomScale = 2.0;
    self.scrollView.minimumZoomScale = 0.2;
}

/**
 *  当用户开始拖拽scrollView时就会调用
 */
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    NSLog(@"开始拖拽-----");
}

/**
 *  只要scrollView正在滚动,就会调用
 */
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    NSLog(@"----正在滚动--%@", NSStringFromCGPoint(scrollView.contentOffset));
}

/**
 *  当用户使用捏合手势的时候会调用
 *
 *  @return 返回的控件就是需要进行缩放的控件
 */
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    NSLog(@"----开始缩放");
    return self.minionView;
}

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

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end