scroll View很重要 app當中隨處可見,分頁,tableview 圖片放大等
frame bounds區別
都是表示位置和大小
frame 在父View 座標系中,bounds在自己的座標系中
ContentSize Contentoffset
ContentSize :scrollview 初始化時候要設定 需要滾動檢視的大小
Contentoffset 是滾動之後位置偏移量 跟scroll view bounds保持一致
Demo
@interface ScrollVC() <UIScrollViewDelegate>
@property (strong ,nonatomic) UIScrollView * scrollView;
@property (strong ,nonatomic) UIImageView * imageView;
@end
@implementation ScrollVC
- (void)viewDidLoad {
[super viewDidLoad];
self.imageView=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"bigPic"]];
self.scrollView=[[UIScrollView alloc]initWithFrame:self.view.bounds];
self.scrollView.backgroundColor=[UIColor blackColor];
self.scrollView.contentSize=self.imageView.bounds.size;
[self.view addSubview:_scrollView];
[self.scrollView addSubview:_imageView];
self.scrollView.delegate=self;
[self setScale];
}
// 設定 scroll
-(void)setScale{
CGSize boundSize=self.scrollView.bounds.size;
CGSize imageSize=self.imageView.bounds.size;
float xScale=boundSize.width/imageSize.width;
float yScale=boundSize.height/imageSize.height;
//計算 適合螢幕 寬度 或者 高度的比例大小 fit 模式
float zoomScale=MIN(xScale, yScale);
//_scrollView.frame=self.view.bounds;
_scrollView.minimumZoomScale=zoomScale;
//開始 大小比例
_scrollView.zoomScale=zoomScale ;
_scrollView.maximumZoomScale=3.0;
//CGSize boundSize=self.scrollView.bounds.size;
CGRect frameToCenter=_imageView.frame;
//設定 imageView 被scroll的這個檢視 居中螢幕
if(frameToCenter.size.width<boundSize.width){
frameToCenter.origin.x=(boundSize.width-frameToCenter.size.width )/2;
}
if (frameToCenter.size.height<boundSize.height) {
frameToCenter.origin.y=(boundSize.height-frameToCenter.size.height )/2;
}
_imageView.frame=frameToCenter;
}
#pragma UIScrollViewDelegate
//設定那個view 需要 放大縮小
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
return _imageView;
}
//螢幕 橫向 變化 或者 view 大小變化
-(void)viewWillLayoutSubviews{
[self setScale];
}
ContentInset使用
當scroll view 被navigationbar 擋住時候 往下移位設定
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0,CGRectGetHeight(_myMsgInputView.frame), 0.0);
self.scrollView.contentInset = contentInsets;
contentInset實際上是內容的padding 比如tableview 底部如果不設padding 就會被tabbar 擋住
UIEdgeInsetsMake順序為 上 左 下 右
scrollview 鍵盤顯示內容遮擋問題
TPKeyboardAvoiding 這個包 封裝 鍵盤 show hide 動態修改scroll 的 contestinset來解決問題。
https://github.com/michaeltyson/TPKeyboardAvoiding