阅读795 返回首页    go 阿里云 go 技术社区[云栖]


iOS7开发学习之路:No.9: 引导页之三&内存释放

之前的两篇Blog介绍了两种不同的引导页的编写方法,但是都各自有各自的缺点:利用scrollView(https://blog.csdn.net/u011156012/article/details/37592445)没有加入可以显示当前页面位置的navigation;如果直接使用PageViewController(https://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是不会改变的。

 

<UIScrollViewDelegate>

最后更新:2017-04-03 05:39:27

  上一篇:go 快速清空linux下文本文件内容
  下一篇:go 插入法排序