UISlider+UILable 实现对字体大小的设置

    今天主要是实现了类似于iPhone设置页面的文字字体设置,具体效果如下:

    


    点击第一个页面的cell会跳转到字体大小详情设置页面。在字体大小详情设置页面,拖动UISlider滑动条可以改变上方文本的大小。

   还有一点就是,需要将用户设置的字体大小保存在一个plist配置文件中,这样当下一次进入时就可以先读取用户之前的配置。这涉及到iPhone开发中对文件的读写操作,由于水果的沙盒机制,不同程序之间是不能互相访问文件的,每个程序都有自己的文件夹用于保存自己的数据,这当然是出于安全的考虑。个人觉得,相对于Android,水果的产品的确是要安全的多,多很多。

   首先,建立一个基于视图的工程,storyBoard中拖入一个Navigation Controller,如下:

      

  

        记得将Navigation Controller设置为初始页,不然后面在页面跳转时可能会出现黑屏的的情况,将UITableView的style设为Group,个人觉得plain看着不大顺眼,当然你可能有不同的看法。

        将UITableView中的cell和ViewController相关联,并在ViewController中拖入一个UILable作为文本显示,一个UISlider用以拖动,一个UILable用以显示字体大小,一个UILablei显示“字体大小”作为提示。

       第一个页面的.h文件:

#import 
#import  "ViewController.h"
@interface settingRootViewController : UITableViewController
{
    
}
@property(nonatomic,retain)IBOutlet UITableView *settingTableView;
@end

注意要设置UITableView的两个delegate

     第一个页面的.m文件:

#import "settingRootViewController.h"
#import 
@interface settingRootViewController ()

@end

@implementation settingRootViewController
@synthesize settingTableView=_settingTableView;

- (void)viewDidLoad
{
    [super viewDidLoad];

    _settingTableView.delegate=self;
    _settingTableView.dataSource=self;
    
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell==nil) {
        cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
//    cell.layer.cornerRadius=9.0;
//    cell.layer.masksToBounds=YES;
    cell.imageView.layer.cornerRadius=9.0;
    cell.imageView.layer.masksToBounds=YES;
    
    UIImage *fontImage=[UIImage imageNamed:@"fontSetting.png"];
    cell.imageView.image=fontImage;
    cell.textLabel.text=@"字体";
    cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
    cell.selectionStyle=UITableViewCellSelectionStyleBlue;
    return cell;
}
 
@end

其中cell的设置都可以在storyBoard中完成,但还是建议大家用代码实现。因为毕竟代码是根本,等到你自己自定义cell的时候就知道了,依赖于可视化界面编程的程序员迟早要傻掉.

     然后是第二个页面的.h文件:

#import 

@interface ViewController : UIViewController
{
    NSDictionary *userDefault;
    BOOL plistExist;//配置文件是否存在
    NSInteger showFontValue;
}
@property(nonatomic,retain)IBOutlet UILabel *fontLabel;
@property(nonatomic,retain)IBOutlet UISlider *fontSlider;
@property(nonatomic,retain)
    IBOutlet UILabel *fontShow;
@end
     第二个页面的.m文件:

#import "ViewController.h"
#define MAXFont 35
#define MINFont 15
@interface ViewController ()

@end

@implementation ViewController
@synthesize fontLabel=_fontLabel;
@synthesize fontSlider=_fontSlider;
@synthesize fontShow=_fontShow;
- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.view addSubview:_fontLabel];
    [self.view addSubview:_fontSlider];    

    _fontSlider.maximumValue=MAXFont;
    _fontSlider.minimumValue=MINFont;
    
    [self readThePlist];
    showFontValue= _fontSlider.value;
    _fontShow.text=[NSString stringWithFormat:@"%d",showFontValue];
    _fontLabel.font=[UIFont fontWithName:@"Helvetica" size:showFontValue];
    
//    [_fontSlider setBackgroundColor:[UIColor blueColor]];
    [_fontSlider addTarget:self action:@selector(fontChanged:) forControlEvents:UIControlEventValueChanged];
}
-(void)readThePlist
{
    NSString *plistPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"userDefault.plist"];
    if ([[NSFileManager defaultManager] fileExistsAtPath:plistPath]) 
    {
        plistExist=true;
        userDefault=[[NSMutableDictionary alloc]initWithContentsOfFile:plistPath];
    }
    else //创建文件
    {
        NSLog(@"create");
        userDefault=[[NSMutableDictionary alloc] initWithCapacity:12];
        
        [userDefault writeToFile:plistPath atomically:YES];
    }
    if (plistExist) {
      NSNumber *font=[userDefault valueForKey:@"font"];
        _fontSlider.value=[font intValue];
    }else {
        _fontSlider.value=17;//设置默认值
    }

}
-(void)fontChanged:(UISlider *)sender
{
    float fontValue=sender.value;
    _fontLabel.font=[UIFont fontWithName:@"Helvetica" size:fontValue];//设置字体和大小
    showFontValue=sender.value;
    _fontShow.text=[NSString stringWithFormat:@"%d",showFontValue];
    [self saveToPlistFile];
}
-(void)saveToPlistFile
{
    NSString *localPath=[[NSBundle mainBundle] pathForResource:@"userDefault" ofType:@"plist"];
    NSString *plistPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]stringByAppendingPathComponent:@"userDefault.plist"];
    if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]) {
        [[NSFileManager defaultManager] copyItemAtPath:localPath toPath:plistPath error:nil];
    }
    
   [userDefault setValue:[NSNumber numberWithInteger:showFontValue] forKey:@"font"];
    NSLog(@"-----plist-----%@,count=%i",userDefault,[userDefault count]);
    
    [userDefault writeToFile:plistPath atomically:YES];
    

}
- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end
实现时几点注意的地方:

1.UISlider.value的值是float型,因此在显示文本大小时,须先转化为int型,再转化为NSString型赋值给_fontShow.text。

2.setValue:forKey:函数中的value只能是一个对象,所以在将文本大小这么一个NSInteger类型的数值传给函数时,需要将其转化为NSNumber。转化方式为:

[NSNumber numberWithInteger:showFontValue]
3.同样在读取plist配置文件时,需要将读出的NSNumber对象转化为NSInteger数值类型再赋值给UISlider:
NSNumber *font=[userDefault valueForKey:@"font"];
_fontSlider.value=[font intValue];

4.int和NSString的相互转化:

NSString *string=[NSString stringWithFormat:@"%d",showFontValue];
int showFontValue=[string intValue];

5.NSInteger和int的区别:苹果的官方文档中总是推荐用NSInteger,在苹果的api实现中,NSInteger是一个封装,它会识别当前操作系统的位数,自动返回最大的类型。所以:用NSInteger,32位系统NSInteger是一个int,即32位,但当时64位系统时,NSInteger便是64位的。

6.在cell中cell.imageView的图片会挡住cell的圆角,如下:



理想的情况应该是这样:



解决的办法就是第一个.m中的:

 cell.imageView.layer.cornerRadius=9.0;
 cell.imageView.layer.masksToBounds=YES;

当然要先添加 #import 。这一点可参考一个帅气老外的文章:http://atastypixel.com/blog/easy-rounded-corners-on-uitableviewcell-image-view/。




  


   

你可能感兴趣的:(iOS开发)