之前的两篇Blog介绍了两种不同的引导页的编写方法,但是都各自有各自的缺点:利用scrollView(http://blog.csdn.net/u011156012/article/details/37592445)没有加入可以显示当前页面位置的navigation;如果直接使用PageViewController(http://blog.csdn.net/u011156012/article/details/37739205)的话,默认的屏幕下方的空白区域又显得很扎眼,所以想要改进的话,最终还是采用ScrollView+PageControl的方法来实现。
其实这种方法是在第一种方法上的改进而已,依然是利用ScrollView来实现,不过加上了PageControll而已。
在初始化scrollview的时候也同时初始化pagecontroll
pageControl = [[UIPageControl alloc] init]; pageControl.frame=CGRectMake(110, 400, 100, 30) ; pageControl.numberOfPages = 4; // 一共显示多少个圆点(多少页) // 设置非选中页的圆点颜色 pageControl.pageIndicatorTintColor = [UIColor lightGrayColor]; // 设置选中页的圆点颜色 pageControl.currentPageIndicatorTintColor = [UIColor whiteColor]; // 禁止默认的点击功能 pageControl.enabled = NO; pageControl.backgroundColor=[UIColor clearColor]; [self.view addSubview:pageControl];
同时在头文件里面加入对ScrollView的代理 < UIScrollViewDelegate >
同时在下面两个方法里面修改对pagecontroll
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ //更新UIPageControl的当前页 CGPoint offset = scrollView.contentOffset; CGRect bounds = scrollView.frame; [pageControl setCurrentPage:offset.x / bounds.size.width]; } -(void) scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat pageWidth = self.view.frame.size.width; // 在滚动超过页面宽度的50%的时候,切换到新的页面 int page = floor((scrollView.contentOffset.x + pageWidth/2)/pageWidth) ; pageControl.currentPage = page; }
很简单,这样就ok了。
内存释放。
之前开发过程中,总是用在StoryBoard中拖拽进控件的方式来设置页面,这样设计的好处是可以很直观地看到页面的效果,但是缺点是如果所有控件都提前布置好了,容易造成很多内存的浪费,例如有些控件并不需要一直存在,只在需要的时候new一个,然后使用完成后release就好了。这些在MRC时候很容易实现,可是现在iOS的开发都使用ARC了,之前一篇Blog也学习了ARC的一些基础知识,就是在一个对象没有strong类型的指针指向时,它就会自动释放了。下面介绍下如何在程序中手动释放内存。
例如我们手动alloc了一个datepicker
//init the datepicker _TheDatePicker= [[UIDatePicker alloc]initWithFrame:CGRectMake(0,self.view.frame.size.height*1/2+5, 0, 0)]; _TheDatePicker.datePickerMode = UIDatePickerModeDate; _TheDatePicker.date = _pickedDate; [_TheDatePicker setBackgroundColor:[UIColor whiteColor]]; [self.view addSubview:_TheDatePicker];
_TheDatePicker是一个私有变量,默认是strong类型的。当我们使用Datepicker选择完成之后,我们需要把他释放掉,因为可能用户之后再也不需要它了,而如果仅仅使用_TheDatePicker setHidden 方法,没法把内存释放掉,释放内存的方法是下面两行函数:
[_TheDatePicker removeFromSuperview]; _TheDatePicker = nil;
不得不提下不知道是不是Xcode5.1的一个bug?就是如果我们事前在storyboard上拖拽进去一个控件,如果我们想在程序中手动改变它的位置,控件的大小必须和之前设置的一致。
就是在我们调用frame = CGRectMaker();里面的4个参数的时候,前面表示x,y坐标的可以改变,但是后面表示width和height的两个值必须和你在storyboard中拖拽进去的值保持一致。否则这个控件的frame是不会改变的。