IOS开发基础知识--碎片10

1:如何给表格单元列增加选择时的背影效果

if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        cell.backgroundColor = [UIColor clearColor];
        cell.textLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:18];
        cell.textLabel.textColor = [UIColor whiteColor];
        cell.textLabel.highlightedTextColor = [UIColor lightGrayColor];
        UIView *sbg=[[UIView alloc] initWithFrame:cell.frame];
        sbg.backgroundColor=[UIColor colorWithWhite:0.5 alpha:0.3];
        cell.selectedBackgroundView = sbg;
    }

2:修改标题栏的文字

UIColor *cc = [UIColor whiteColor];
    NSDictionary * dict = [NSDictionary dictionaryWithObject:cc forKey:UITextAttributeTextColor];
    self.navigationController.navigationBar.titleTextAttributes = dict;

3:一个滚动启动页功能代码

#define NewFeatureCount 4

@interface HVWNewFeatureViewController () <UIScrollViewDelegate>

@property(nonatomic, strong) UIPageControl *pageControl;

@end

@implementation HVWNewFeatureViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    // 添加scrollView
    [self setupScrollView];
    
    // 添加pageControl
    [self setupPageControl];
}

/** 添加scrollView */
- (void) setupScrollView {
    // 创建一个scrollView
    UIScrollView *scrollView = [[UIScrollView alloc] init];
    scrollView.frame = self.view.bounds;
    
    // 添加图片
    for (int i=0; i<NewFeatureCount; i++) {
        
        // 获取图片
        NSString *featureImageName = [NSString stringWithFormat:@"new_feature_%d", i+1];
        UIImageView *featureImageView = [[UIImageView alloc] initWithImage:[UIImage imageWithNamed:featureImageName]];
        
        // 设置图片尺寸位置
        CGFloat featureWidth = self.view.width;
        CGFloat featureHeight = self.view.height;
        CGFloat featureX = featureImageView.width * i;
        CGFloat featureY = 0;
        featureImageView.frame = CGRectMake(featureX, featureY, featureWidth, featureHeight);
        
        // 如果是最后一页,加上功能按钮
        if (i == (NewFeatureCount - 1)) {
            // 为了让最后一页的的功能按钮能够生效,必须激活交互功能
            featureImageView.userInteractionEnabled = YES;
            
            [self addFunctionButton:featureImageView];
        }
        
        // 添加图片到scrollView
        [scrollView addSubview:featureImageView];
    }
    
    // 设置scrollView功能属性
    scrollView.userInteractionEnabled = YES;
    scrollView.scrollEnabled = YES; // 支持滚动
    scrollView.contentSize = CGSizeMake(self.view.width * NewFeatureCount, 0); // 只需要水平滚动
    scrollView.pagingEnabled = YES; // 支持分页
    scrollView.showsHorizontalScrollIndicator = NO; // 隐藏水平滚动条
    
    // 设置背景色
    scrollView.backgroundColor = [UIColor colorWithRed:246/255.0 green:246/255.0 blue:246/255.0 alpha:1.0];
    
    // 设置代理
    scrollView.delegate = self;
    
    // 添加
    [self.view addSubview:scrollView];
}

/** 添加pageControl */
- (void) setupPageControl {
    // pageControl不能加在scrollView上,不然会随着内容一起滚动
    UIPageControl *pageControl = [[UIPageControl alloc] init];
    pageControl.pageIndicatorTintColor = [UIColor blackColor];
    pageControl.currentPageIndicatorTintColor = [UIColor redColor];
    pageControl.numberOfPages = NewFeatureCount;
    
    // 设置位置
    pageControl.centerX = self.view.width * 0.5;
    pageControl.centerY = self.view.height * 0.9;
    
    
    self.pageControl = pageControl;
    [self.view addSubview:pageControl];
}

#pragma mark - UIScrollViewDelegate
/** scrollView滚动代理方法,在这里控制页码指示器 */
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // 四舍五入,让图片滚动超过中线的时候改变页码
    self.pageControl.currentPage = scrollView.contentOffset.x / scrollView.width + 0.5;
}

#pragma mark - 最后一页的功能
/** 添加功能按钮 */
- (void) addFunctionButton:(UIImageView *) imageView {
    // 添加"分享"选项按钮
    [self addShareButton:imageView];
    
    // 添加"进入微博"按钮
    [self addEnterWeiboButton:imageView];
}

/** 分享选项按钮 */
- (void) addShareButton:(UIImageView *) imageView  {
    // 创建按钮
    UIButton *shareButton = [UIButton buttonWithType:UIButtonTypeCustom];
    
    [shareButton setTitle:@"分享给大家" forState:UIControlStateNormal];
    
    [shareButton setImage:[UIImage imageWithNamed:@"new_feature_share_false"] forState:UIControlStateNormal];
    [shareButton setImage:[UIImage imageWithNamed:@"new_feature_share_true"] forState:UIControlStateSelected];
    
    
    [shareButton addTarget:self action:@selector(shareButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
    
    [shareButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    
    // 位置尺寸
    shareButton.size = CGSizeMake(150, 50);
    
    // 必须先设置了size,center才真的在中心,不然就是从左上角开始!!!
    shareButton.centerX = self.view.width * 0.5;
    shareButton.centerY = self.view.height * 0.65;

    // 设置内间距
    shareButton.titleEdgeInsets = UIEdgeInsetsMake(0, 10.0, 0, 0);
    
    // 添加
    [imageView addSubview:shareButton];
}

/** 分享选项点击事件方法 */
- (void) shareButtonClicked:(UIButton *) button {
    button.selected = !button.selected;
}

/** “进入微博"按钮 */
- (void) addEnterWeiboButton:(UIImageView *) imageView  {
    // 创建按钮
    UIButton *enterButton = [UIButton buttonWithType:UIButtonTypeCustom];
    enterButton.userInteractionEnabled = YES;
    [enterButton setBackgroundImage:[UIImage imageWithNamed:@"new_feature_finish_button"] forState:UIControlStateNormal];
    [enterButton setBackgroundImage:[UIImage imageWithNamed:@"new_feature_finish_button_highlighted"] forState:UIControlStateHighlighted];
    [enterButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    [enterButton setTitle:@"进入微博" forState:UIControlStateNormal];
    
    // 位置尺寸
    enterButton.size = enterButton.currentBackgroundImage.size;
    enterButton.centerX = self.view.width * 0.5;
    enterButton.centerY = self.view.height * 0.8;
    
    // 监听点击
    [enterButton addTarget:self action:@selector(enterWeiboButtonClicked) forControlEvents:UIControlEventTouchUpInside];
    
    // 添加
    [imageView addSubview:enterButton];
}

/** “进入微博” 按钮点击 */
- (void) enterWeiboButtonClicked {
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    window.rootViewController = [[HVWTabBarViewController alloc] init];
}

@end

4:增加删除控制器

增加控制器:

[self addChildViewController:toViewController];
[toViewController didMoveToParentViewController:self];

小实例:

- (IBAction)btnAction:(id)sender {
    CiderViewController *cid=[[CiderViewController alloc] init];
    [self addChildViewController:cid];
    CGRect frame=self.myView.bounds;
    frame.origin.y=110;
    frame.size.width=290;
    frame.size.height=90;
    
    cid.view.frame=frame;
    cid.view.backgroundColor=[UIColor redColor];
    [self.myView addSubview:cid.view];
    [cid didMoveToParentViewController:self];
}

删除控制器:

1.当我们向我们的视图控制器容器中调用removeFromParentViewController方法时,必须要先调用该方法,且parent参数为nil:
[将要删除的视图控制器 willMoveToParentViewController:nil];

[fromViewController willMoveToParentViewController:nil];
[fromViewController removeFromParentViewController];Í

一些说明:

关于willMoveToParentViewController方法和didMoveToParentViewController方法的使用

1.这两个方法用在子试图控制器交换的时候调用!即调用transitionFromViewController 方法时,调用。

2.当调用willMoveToParentViewController方法或didMoveToParentViewController方法时,要注意他们的参数使用:
当某个子视图控制器将从父视图控制器中删除时,parent参数为nil。
即:[将被删除的子试图控制器 willMoveToParentViewController:nil];
当某个子试图控制器将加入到父视图控制器时,parent参数为父视图控制器。
即:[将被加入的子视图控制器 didMoveToParentViewController:父视图控制器];

3.无需调用[子视图控制器 willMoveToParentViewController:父视图控制器]方法。因为我们调用[父视图控制器 addChildViewController:子视图控制器]时,已经默认调用了。
只需要在transitionFromViewController方法后,调用[子视图控制器didMoveToParentViewController:父视图控制器];

4.无需调用[子视图控制器 didMoveToParentViewController:父视图控制器]方法。因为我们调用
[子视图控制器 removeFromParentViewController]时,已经默认调用了。
只需要在transitionFromViewController方法之前调用:[子视图控制器 willMoveToParentViewController:nil]。

不错的文章(http://www.cocoanetics.com/2012/04/containing-viewcontrollers/)

5:关于UIView的autoresizingMask属性的研究

在 UIView 中有一个autoresizingMask的属性,它对应的是一个枚举的值(如下),属性的意思就是自动调整子控件与父控件中间的位置,宽高。

enum {
   UIViewAutoresizingNone                 = 0,
   UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
   UIViewAutoresizingFlexibleWidth        = 1 << 1,
   UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
   UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
   UIViewAutoresizingFlexibleHeight       = 1 << 4,
   UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};

UIViewAutoresizingNone就是不自动调整。
UIViewAutoresizingFlexibleLeftMargin 自动调整与superView左边的距离,保证与superView右边的距离不变。
UIViewAutoresizingFlexibleRightMargin 自动调整与superView的右边距离,保证与superView左边的距离不变。
UIViewAutoresizingFlexibleTopMargin 自动调整与superView顶部的距离,保证与superView底部的距离不变。
UIViewAutoresizingFlexibleBottomMargin 自动调整与superView底部的距离,也就是说,与superView顶部的距离不变。
UIViewAutoresizingFlexibleWidth 自动调整自己的宽度,保证与superView左边和右边的距离不变。
UIViewAutoresizingFlexibleHeight 自动调整自己的高度,保证与superView顶部和底部的距离不变。
UIViewAutoresizingFlexibleLeftMargin  |UIViewAutoresizingFlexibleRightMargin 自动调整与superView左边的距离,保证与左边的距离和右边的距离和原来距左边和右边的距离的比例不变。比如原来距离为20,30,调整后的距离应为68,102,即68/20=102/30。
其它的组合类似。

实例:

CGRect frame = [[UIScreen mainScreen] applicationFrame];
UIView *view = [[UIView alloc] initWithFrame:frame];
view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

6:系统提供的dispatch方法

为了方便地使用GCD,苹果提供了一些方法方便我们将block放在主线程 或 后台线程执行,或者延后执行。使用的例子如下:

    1    //  后台执行: 
    2     dispatch_async(dispatch_get_global_queue(00), ^3          // something 
    4     }); 
    5     // 主线程执行: 
    6     dispatch_async(dispatch_get_main_queue(), ^7          // something 
    8     }); 
    9     // 一次性执行: 
    10     static dispatch_once_t onceToken; 
    11     dispatch_once(&onceToken, ^12         // code to be executed once 
    13     }); 
    14     // 延迟2秒执行: 
    15     double delayInSeconds = 2.016     dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
    17     dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
    18         // code to be executed on the main queue after delay 
    19     }); 

dispatch_queue_t 也可以自己定义,如要要自定义queue,可以用dispatch_queue_create方法,示例如下:

    1    dispatch_queue_t urls_queue = dispatch_queue_create("blog.devtang.com", NULL); 
    2    dispatch_async(urls_queue, ^3         // your code 
    4    }); 
    5    dispatch_release(urls_queue); 

另外,GCD还有一些高级用法,例如让后台2个线程并行执行,然后等2个线程都结束后,再汇总执行结果。这个可以用dispatch_group, dispatch_group_async 和 dispatch_group_notify来实现,示例如下:

    1    dispatch_group_t group = dispatch_group_create(); 
    2    dispatch_group_async(group, dispatch_get_global_queue(0,0), ^3          // 并行执行的线程一 
    4     }); 
    5     dispatch_group_async(group, dispatch_get_global_queue(0,0), ^6          // 并行执行的线程二 
    7     }); 
    8     dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^9          // 汇总结果 
    10     }); 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。