iOS——使用ScrollView进行图片的缩放

卫景明
2023-12-01

UIScorllView 是iOS中提供的滑动控件,用来解决当内容区域大于scorllview可视区域时,可以通过滑动的方式查看整个内容区域,UIScorllView的滑动空间的基类。
UITableView(表视图) 内部实现的原理是修改视图的bounds;
// 创建对象 (子视图的大小,红色的区域)
UIScrollView *scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(20, 20, kScreenWidth-20*2, kScreenHeight-20*2)];

// 配置属性

       // 设置内容区域的大小(就可以滚动了)(图片可以动的空间)
scrollView.contentSize = CGSizeMake(280, 508);
scrollView.backgroundColor = [UIColor redColor];
    // 修改内容区域的偏移量
    // X变大往左偏移,Y变大,往上偏移。
scrollView.contentOffset = CGPointMake(0, 0);
    // 是否显示滚动条(默认YES)
scrollView.showsHorizontalScrollIndicator = NO;  // 水平方向
scrollView.showsVerticalScrollIndicator = NO;  // 垂直方向
    //修改滚动指示条的样式
scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
    // 设置scrollView能否滚动
scrollView.scrollEnabled = YES;
    // 方向锁,设置滑动时,只能朝一个方向滚动
scrollView.directionalLockEnabled = NO;
    // 设置是否整屏幕移动
scrollView.pagingEnabled = NO;
    // 设置当到达屏幕边缘时是否有弹簧效果
scrollView.bounces = YES;
    // 设置当内容区域等于或者小于可视区域时,依然具有边界反弹效果
scrollView.alwaysBounceHorizontal = YES;
scrollView.alwaysBounceVertical = YES;
    // 设置点击状态栏,scrollView是否回到顶部,此时Y轴上的偏移量是零
scrollView.scrollsToTop = YES;
    // scrollView的代理属性
scrollView.delegate = self;
    // 设置缩放比例
scrollView.minimumZoomScale = 0.5;
scrollView.maximumZoomScale = 3.0;

// 添加到父视图
[self.view addSubview:scrollView];
[scrollView release];

UIImage *image = [UIImage imageNamed:@"4.JPG"];
UIImageView *imageView = [[UIImageView alloc]initWithImage:image];
imageView.tag = 101;
imageView.frame = CGRectMake(0, 0, 280, 528);
[scrollView addSubview:imageView];
[imageView release];

# 代理方法的实现

// 触发时机:只要scrollView滚动,就会一直触发,会触发多次
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
// NSLog(@”滚了没”);
// 能够及时获得偏移量
// NSLog(@”%@”,NSStringFromCGPoint(scrollView.contentOffset));
}

// 触发时机:只要进行了缩放,就一直触发,会触发多次
- (void)scrollViewDidZoom:(UIScrollView *)scrollView NS_AVAILABLE_IOS(3_2){

// NSLog(@”缩放了没”);
// NSLog(@”%.2f”,scrollView.zoomScale);
// 存放scrollView的size
CGSize sSize = scrollView.frame.size;
// 取出imageView的frame
CGRect iFrame = ((UIImageView *)[scrollView viewWithTag:101]).frame;
// 缩放后X的坐标
CGFloat x = (sSize.width - scrollView.contentSize.width)/2;
// 缩放后Y的坐标
CGFloat y = (sSize.height - scrollView.contentSize.height)/2;
// 把求出来的变化量赋值给iFrame
iFrame.origin.x = x;
iFrame.origin.y = y;

((UIImageView *)[scrollView viewWithTag:101]).frame = iFrame;

}

// 触发时机:将要开始拖拽的时候触发(此时手指刚刚开始触摸到scrollView的时候)
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
// NSLog(@”开始拖拽了没”);

}

// 触发时机:拖拽结束的时候(手指离开图片的时候)
- (void)scrollViewWillEndDragging:(UIScrollView )scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint )targetContentOffset NS_AVAILABLE_IOS(5_0){
// NSLog(@”拖拽块要结束了么”);

}

// 触发时机:scrollView已经结束拖拽
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
// NSLog(@”拖拽已经结束了”);
// 在此方法中,拿到contentOffSet的偏移量

}
// 触发时机:将要开始减速的时候触发,此方法不一定会被触发
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
// NSLog(@”减速了么”);
}

// 触发时机:已经结束减速的时候触发(只要上面的不被触发,这个就不会被触发)
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
// NSLog(@”减完速了吗”);

// 一般都在这个方法中获取scrollView的偏移量,或者是设置scrollView的偏移量
[scrollView setContentOffset:CGPointZero animated:YES];

}
// 触发时机:scrollView结束减速并且要有动画效果才会触发(必须要有动画效果!!)
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{
NSLog(@”有动画么”);
}

pragma mark 缩放的实现

// 触发时机,返回缩放后的视图,但是只能返回scrollView上的子视图
- (UIView )viewForZoomingInScrollView:(UIScrollView )scrollView{

return [scrollView viewWithTag:101];

}
// 开始缩放的时候触发
- (void)scrollViewWillBeginZooming:(UIScrollView )scrollView withView:(UIView )view NS_AVAILABLE_IOS(3_2){
// NSLog(@”开始缩放了吗”);
}

// 结束缩放的时候触发
- (void)scrollViewDidEndZooming:(UIScrollView )scrollView withView:(UIView )view atScale:(CGFloat)scale{
NSLog(@”结束缩放了吗”);

}

// 触发时机:点击状态栏时,调用该方法,该方法能实现的前提是scrollToTop的属性是YES
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView{
return YES;
}

// 触发时机:scrollView已经回到顶部了
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView{

}

/* 总结:
scrollView的使用技巧:
使用 scrollViewDidZoom: 实时修改自身子视图的大小
使用 scrollViewDidEndDecelerating: 获取contentOFFSet
*/

 类似资料: