源码-0103-scrollview

本文详细介绍了UIScrollView的基本使用方法,包括contentOffset的调整、滚动条的显示与隐藏、子视图的布局及UIScrollView的代理方法等核心内容。通过实例展示了如何通过不同方式改变contentOffset来实现视图的滚动,同时探讨了UIScrollView的代理方法在拖拽操作中的应用。

UIScrollView的基本使用

 

//
//  ViewController.m
//  03-contentOffset的使用
#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
//    UIImageView *imageView = [[UIImageView alloc] init];
//    imageView.image = [UIImage imageNamed:@"minion"];
//    imageView.frame = CGRectMake(0, 0, imageView.image.size.width, imageView.image.size.height);
    
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"minion"]];
    [self.scrollView addSubview:imageView];
    
    // 设置内容大小
    self.scrollView.contentSize = imageView.image.size;
}

- (IBAction)left:(id)sender {
    // self.scrollView.contentOffset : 偏移量
    // 记录UIScrollView滚动的位置,滚到哪
    // 总结:内容的左上角 和 scrollView自身左上角 的 X\Y差值
    
  //    [UIView animateWithDuration:2.0 animations:^{
  //        self.scrollView.contentOffset = CGPointMake(0, self.scrollView.contentOffset.y);
  //    }];
    //实现动画的方法1
    [UIView animateWithDuration:2.0 animations:^{
        self.scrollView.contentOffset = CGPointMake(0, self.scrollView.contentOffset.y);
    } completion:^(BOOL finished) {
        NSLog(@"执行完毕");
    }];
}

- (IBAction)top:(id)sender {
  //    self.scrollView.contentOffset = CGPointMake(self.scrollView.contentOffset.x, 0);
    

  //实现动画的方法2 CGPoint offset
= CGPointMake(self.scrollView.contentOffset.x, 0); [self.scrollView setContentOffset:offset animated:YES]; } - (IBAction)bottom:(id)sender {
  //实现动画的方法3 [UIView animateWithDuration:
2.0 animations:^{ CGFloat offsetY = self.scrollView.contentSize.height - self.scrollView.frame.size.height; CGPoint offset = self.scrollView.contentOffset; offset.y = offsetY; self.scrollView.contentOffset = offset; }]; // self.scrollView.contentOffset = CGPointMake(self.scrollView.contentOffset.x, offsetY); // self.scrollView.contentOffset.y = offsetY; // OC语法细节:不允许直接修改OC对象的结构体属性的成员 } - (IBAction)right:(id)sender {
  //实现动画的方法4 [UIView beginAnimations:nil context: nil]; [UIView setAnimationDuration:
2.0]; [UIView setAnimationDelegate:self]; // 代理 [UIView setAnimationDidStopSelector:@selector(stop)]; [UIView setAnimationWillStartSelector:@selector(start)]; CGFloat offsetX = self.scrollView.contentSize.width - self.scrollView.frame.size.width; self.scrollView.contentOffset = CGPointMake(offsetX, self.scrollView.contentOffset.y); [UIView commitAnimations]; } - (void)start { NSLog(@"start"); } - (void)stop { NSLog(@"stop"); } @end

 

 

contentOffset的使用

//
//  ViewController.m
//  03-contentOffset的使用
#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"minion"]];
//    [self.scrollView addSubview:imageView];
    [self.scrollView insertSubview:imageView atIndex:0];
    
    // 设置内容大小
    self.scrollView.contentSize = imageView.image.size;
    
    // 设置contentInset
    self.scrollView.contentOffset = CGPointMake(0, -64);
    self.scrollView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
}

- (IBAction)left:(id)sender {
    self.scrollView.contentOffset = CGPointMake(0, self.scrollView.contentOffset.y);
}

- (IBAction)top:(id)sender {
    self.scrollView.contentOffset = CGPointMake(self.scrollView.contentOffset.x, 0);
}

- (IBAction)bottom:(id)sender {
    CGFloat offsetY = self.scrollView.contentSize.height - self.scrollView.frame.size.height;
    CGPoint offset = self.scrollView.contentOffset;
    offset.y = offsetY;
    self.scrollView.contentOffset = offset;
}

- (IBAction)right:(id)sender {
    CGFloat offsetX = self.scrollView.contentSize.width - self.scrollView.frame.size.width;
    self.scrollView.contentOffset = CGPointMake(offsetX, self.scrollView.contentOffset.y);
}
@end

 滚动条

//
//  ViewController.m
//  05-scrollView的滚动条

#import "ViewController.h"

@interface ViewController ()
{
    CGRect _lastRect;
}
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
/** <#注释#> */
@property(nonatomic,strong)UIView* gird;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
//    self.scrollView.showsHorizontalScrollIndicator = NO;
//    self.scrollView.showsVerticalScrollIndicator = NO;
    NSMutableArray *girdArr = [NSMutableArray array];
    for (int i = 0; i<50; i++) {
        int row = i / 3; // 行号
        int col = i % 3; // 列号
        CGFloat x = col * (50 + 30); // 列号决定了X
        CGFloat y = row * (50 + 30); // 行号决定了Y
      self.gird =  [self addGridWithX:x y:y];
        if (i == 49) {
            _lastRect = self.gird.frame;
        }
        [girdArr addObject:self.gird];
    }
//    
//    self.scrollView.subviews[49];
   UIView* lastView = [girdArr lastObject];
    
//    UIView *lastView = [self.scrollView.subviews lastObject];
//    CGFloat contentH = lastView.frame.origin.y + lastView.frame.size.height;
    CGFloat contentH = CGRectGetMaxY(lastView.frame);
    
    NSLog(@"%@", [self.scrollView.subviews lastObject]);
    self.scrollView.contentSize = CGSizeMake(0, contentH);
    NSLog(@"%@", [self.scrollView.subviews lastObject]);
}

- (UIView*)addGridWithX:(CGFloat)x y:(CGFloat)y
{
    UIView *grid = [[UIView alloc] init];
    grid.frame = CGRectMake(x, y, 50, 50);
    grid.backgroundColor = [UIColor blueColor];
    [self.scrollView addSubview:grid];
    return grid;
}

//NSLog(@"%@", self.scrollView.subviews);
// 滚动控件
//    UIScrollView *scrollView = [[UIScrollView alloc] init];
//    scrollView.frame = CGRectMake(30, 50, 250, 250);
//    scrollView.backgroundColor = [UIColor redColor];
//    [self.view addSubview:scrollView];
//    NSLog(@"%@", scrollView.subviews);
@end

 

UIScrollView的代理
//
//  ViewController.m
//  06-UIScrollView的代理
#import "ViewController.h"
#import "XMGDog.h"

@interface ViewController () <UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *scrollview;
/** dog */
@property (nonatomic, strong) XMGDog *dog;

@property (weak, nonatomic) UIButton *button;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIButton *button = [[UIButton alloc] init];
    button.frame = CGRectMake(0, 0, 100, 100);
    button.backgroundColor = [UIColor yellowColor];
    [self.view addSubview:button];
    self.button = button;
        
    UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"minion"]];
    [self.scrollview addSubview:imageView];
    self.scrollview.backgroundColor = [UIColor redColor];
    self.scrollview.contentSize = imageView.image.size;
    
    // 设置代理
    self.dog = [[XMGDog alloc] init];
    self.scrollview.delegate = self.dog;
    
    // ARC:没有被强指针引用的对象就会被销毁
    
    UITextField *textField = [[UITextField alloc] init];
    textField.frame = CGRectMake(20, 300, 200, 30);
    textField.backgroundColor = [UIColor redColor];
    textField.delegate = self.dog;
//    [textField addTarget:self action:@selector(textChange:) forControlEvents:UIControlEventEditingChanged];
    [self.view addSubview:textField];
}

//- (void)textChange:(UITextField *)textField
//{
//    NSLog(@"textChange-------%@", textField.text);
//}

#pragma mark - <UIScrollViewDelegate>
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
//    NSLog(@"scrollViewDidScroll------");
}

/**
 * 即将开始拖拽的时候调用
 */
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    NSLog(@"scrollViewWillBeginDragging------");
}

/**
 * 结束拖拽的时候调用
 */
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    NSLog(@"scrollViewDidEndDragging------");
}

/**
 * (减速完毕)由于惯性停止滚动的时候调用
 */
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    NSLog(@"scrollViewDidEndDecelerating------");
}

@end

 

转载于:https://www.cnblogs.com/laugh/p/6398746.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值