注:只要有学到新的知识,会不断更新
CGPoint contentOffset; // 显示窗口在滚动内容画布里面的左上角的偏移量,(x, y)
CGSize contentSize; // 滚动内容的画布大小
UIEdgeInsets contentInset; // 可以在外围加入的一个边框,有距离高,底部,左边,右边的距离
- 可能会用到的方法来设置contentSize,CGRectGetMaxY(放一个控件的frame),通过这个方法,可以返回一个控件的最大y坐标,比如要设置一个最底部的空间刚好压滚动空间contentsize的底部,就用这个方法令滚动控件的高等于最底部空间的最大y
关于监控滚动的代理
- 先遵循<UIScrollViewDelegate>,并设置代理为self
self.scrollView.delegate = self;
此时可以实现代理里面各种方法来对滚动进行监听,并完成对应的操作
比如实现- (void)scrollViewDidScroll:这个方法,只要在滚动,就调用这个方法。可以用来设置pagecontrol的当前页的变换
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
//利用偏移量,设置控件的当前页
int page = (int)(scrollView.contentOffset.x / scrollView.frame.size.width + 0.5);
self.pageControl.currentPage = page;
}
封装自动来回滚动UIScrollView记录
首先创建一个自定义xib,和两个继承UIview的类文件
- 要提供一个接口给外界创建,比如类方法,名为类名,
- 通过mainbundle加载xib文件,并返回。
- 通过awakeFromNib或者initWithFrame来初始化控件,里面调用[self setUp]
- //通过代码创建空间时,用这个方法来初始化 (instancetype)initWithCoder:(NSCoder *)aDecoder
- /通过xib/storyboard中创建控件时,调用这个方法初始化(void)awakeFromNib
- 记得定义一个叫setup的方法,里面放初始化的操作.
接着重写传进来的数据set方法,并重写layoutSubviews
- 将传入的数据进行过滤,赋值,布局等操作
- 在layoutSubview(当父控件位置被修改的时候调用)s中对子控件 frame等属性设置
将定时器写在setUp内
[NSTimer scheduledTimerWithTimeInterval:1.5
这里要写方法所在的类 target:pageview
selector:@selector(changePage)
userInfo:nil
repeats:YES];
}
- 如何换滚动的方向
// MARK: - 换页的功能
- (void)changePage{
CGFloat imgW = self.scrollView.frame.size.width;
CGFloat dx = self.scrollView.contentOffset.x + imgW;
//记录当前的方向, static用来存储,下次进来的值保持上次
static BOOL direction ;
//仅当最后一页或者第一页的时候判断方向
if(self.pageControl.currentPage == self.imageNames.count -1|| self.pageControl.currentPage == 0)
{direction = [self checkDirection];}
//根据判断结果进行方向滚动
if(direction){
[UIView animateWithDuration:1.0 animations:^{self.scrollView.contentOffset = CGPointMake(dx, 0);}];
}
if(!direction ){
[UIView animateWithDuration:1.0 animations:^{self.scrollView.contentOffset = CGPointMake(dx - 2*imgW, 0);}];
}
}
// MARK: - 方向的判断
- (BOOL) checkDirection{
BOOL gorigth = YES ;
if (self.pageControl.currentPage == 0) {
gorigth = YES;
}
if(self.pageControl.currentPage == self.imageNames.count -1){
gorigth = NO;
}
return gorigth;
}
遇到的问题
- 不能将定时器放在layoutSubview方法中,这样会由于苹果系统的runloop机制,这个机制会收集一些修改(frame,color等),然后在循环结束时一并的去修改,此时就会连续几乎同时的调用多次layoutSubview中的方法.