iOS开发记录

1 篇文章 0 订阅
1 篇文章 0 订阅

一、   查看Sqlite内容

如果项目中用到sqlite,经常在开发过程中会去查看数据的变化。

找到Sqlite文件存储位置。

~/Library/ApplicationSupport/Simulator/6.1/Applications

其中6.1为自己设置的模拟器版本,如果模拟器为5.0的话就去5.0目录。

但是该位置下可能有很多文件夹,而且是以十六进制字符命名的,这种情况下有个简单的方式找到目标,通过查看文件修改时间,如下:


进入目标目录后,就可以根据自己代码中指定的相对目录去找到sqlite文件了。

比如代码中指定目录为


则实际目录就为:


通过sqlite3命令就可以操作。如下:


 

二、   清除项目缓存

一般情况下在工程中通过cmd+shift+k快捷键清除。

如果不行的话可以直接去删除缓存文件。

~/Library/Developer/Xcode目录下的DerivedData和Snapshots两个目录中的所有文件都删除。


三、   发送post数据

忽略缓存

    //初始化http请求,忽略缓存
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]
                                                           cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                                       timeoutInterval:10];

content-type设置

    NSString *contentType = [NSString stringWithFormat:@"application/x-www-form-urlencoded"];
    [request addValue:contentType forHTTPHeaderField:@"Content-Type"];

设置为其他类型会发送失败,比如text/html,text/xml,不知为何。


四、   自定义视图做导航栏按钮

如果要将导航栏左右两侧的按钮做得精致,用控件基本的属性设置可能很难满足,好在UIBarButtonItem提供了接口用自定义的view来初始化,示例如下:

    UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
    UIImage *backImg = [UIImage imageNamed:@"back.png"] ;
    UIImage *backImg2 = [UIImage imageNamed:@"back2.png"];
    [backButton setImage:backImg forState:UIControlStateNormal];
    [backButton setImage:backImg2 forState:UIControlStateHighlighted];
    [backButton setFrame:CGRectMake(0,0,backImg.size.width,backImg.size.height)];
    [backButton addTarget:self action:@selector(btnBackClicked) forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *backBar = [[UIBarButtonItem alloc] initWithCustomView:backButton];
    [self.navigationItem setLeftBarButtonItem:backBar];

以上展示了用一个UIButton作为UIBarButtonItem的视图,当然除了UIButton我们还可以尝试用其他View来实现自己想要的效果。

五、   自定义TabBar

折腾了一天UITabBar,它的集成度确实很高,不需要做什么工作就能实现功能,但是很让人头疼的是它完全不能满足我的需求,比如每个TabBarItem的图片区域只是限定在上半部分,下面的title不能控制字体大小,烦人的高光效果。还有,对每个TabBarItem的自定义是放在对应的ViewController的初始化过程中,因此在没有进入到对应的视图时是看不到它TabBarItem的效果,这时候只好在storyboard中就先设置好它的样式,但是进入到对应的视图时又发现storyboard中的样式覆盖了代码中的样式,让人十分费解。最终我自己自定义视图来实现Tabbar效果,隐藏了原来TabBar的视图,功能方面继续使用UITabBarController提供的功能。代码如下:

#import <UIKit/UIKit.h>

@interface TabBarViewController : UITabBarController {
    UIButton *btnNews, *btnCollect, *btnMore;
}

@end

说明:继承UITabBarController,实例变量为通过UIButton模拟的三个UITabBarItem。

实现部分的主要代码:

- (void)viewDidLoad
{
    [super viewDidLoad];
    //实例化一个普通View来做TabBar,位置和大小跟原本的TabBar一样
    UIView *tabBarView = [[UIView alloc] initWithFrame:self.tabBar.frame];
    tabBarView.contentMode = UIViewContentModeScaleToFill;
    
    //获取TabBar的宽和高
    float navBarW = self.tabBar.frame.size.width;
    float navBarH = self.tabBar.frame.size.height;
    
    //实例化三个UIButton来模拟TabBarItem,配置它们的样式和点击事件
    btnNews = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, navBarW / 3, navBarH)];
    [btnNews setBackgroundImage:[UIImage imageNamed:@"news.png"] forState:UIControlStateNormal];
    [btnNews setBackgroundImage:[UIImage imageNamed:@"news3.png"] forState:UIControlStateHighlighted];
    [btnNews setBackgroundImage:[UIImage imageNamed:@"news2.png"] forState:UIControlStateDisabled];
    [btnNews addTarget:self action:@selector(barButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
    
    btnCollect = [[UIButton alloc] initWithFrame:CGRectMake(navBarW / 3, 0, navBarW / 3, navBarH)];
    [btnCollect setBackgroundImage:[UIImage imageNamed:@"collectbar.png"] forState:UIControlStateNormal];
    [btnCollect setBackgroundImage:[UIImage imageNamed:@"collectbar2.png"] forState:UIControlStateDisabled];
    [btnCollect setBackgroundImage:[UIImage imageNamed:@"collectbar3.png"] forState:UIControlStateHighlighted];
    [btnCollect addTarget:self action:@selector(barButtonClicked:) forControlEvents:UIControlEventTouchUpInside];

    btnMore = [[UIButton alloc] initWithFrame:CGRectMake(navBarW * 2 / 3, 0, navBarW / 3, navBarH)];
    [btnMore setBackgroundImage:[UIImage imageNamed:@"more.png"] forState:UIControlStateNormal];
    [btnMore setBackgroundImage:[UIImage imageNamed:@"more2.png"] forState:UIControlStateDisabled];
    [btnMore setBackgroundImage:[UIImage imageNamed:@"more3.png"] forState:UIControlStateHighlighted];
    [btnMore addTarget:self action:@selector(barButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
    
    //把三个按钮添加到自己的TabBar上
    [tabBarView addSubview:btnNews];
    [tabBarView addSubview:btnCollect];
    [tabBarView addSubview:btnMore];
    
    //把自己的TabBar放到原来的TabBar的父级视图上
    [self.tabBar.superview addSubview:tabBarView];
    //隐藏掉原来的TabBar
    [self.tabBar setHidden:YES];

}

//三个TabBar的点击实践
- (void)barButtonClicked:(id)sender {
    UIButton *barButton = (UIButton *)sender;
    if (barButton == btnNews) {
        //这是调用UITabBarController切换视图的方法
        [self setSelectedIndex:0];
        barButton.enabled = NO;
        btnCollect.enabled = YES;
        btnMore.enabled = YES;
    } else if (barButton == btnCollect) {
        [self setSelectedIndex:1];
        barButton.enabled = NO;
        btnMore.enabled = YES;
        btnNews.enabled = YES;
    } else if (barButton == btnMore) {
        [self setSelectedIndex:2];
        barButton.enabled = NO;
        btnNews.enabled = YES;
        btnCollect.enabled = YES;
    }
}

别忘了将storyboard或者xib中将UITabBarController设置为自己的Controller,如图:


最终效果图:

每个按钮上的图标、文字、背景都是一整个图片,完全可以做出自己想要的外观。


隐藏TabBar

当进入详细页面时,可能需要将下面的TabBar隐藏掉。如果视图是通过导航栏控制器管理的,在详细视图的viewDidLoad方法里直接调用[self hidesBottomBarWhenPushed]应该就可以隐藏掉TabBar。由于这里的TabBar视图是自定义实现的,因此同时需要自己来隐藏这个自定义视图。经过实际测试发现TabBar视图被隐藏后会在原地留下一个黑框,通过设置其他视图的bounds来试图占满屏幕也没有效果,不知道是iOS本身的bug还是因为我用了自定义实现的原因。总之在网上也有其他网友遇到这样的问题。最终通过这篇【博客】找到了解决办法。

我将实现代码作为函数放到了自定义的TabBarViewController中,如下:

- (void)setTabBarHidden:(BOOL)abool {
    if (abool) {
        [self performSelector:@selector(setTabBarHiddenNow:) withObject:[NSNumber numberWithBool:abool] afterDelay:0.4f];
    } else {
        [self setTabBarHiddenNow:[NSNumber numberWithBool:abool]];
    }
}

- (void)setTabBarHiddenNow:(NSNumber *)aboolNum {
    BOOL abool = aboolNum.boolValue;
    UIView *contentView;
    if ( [[self.view.subviews objectAtIndex:0] isKindOfClass:[UITabBar class]] ) {
        contentView = [self.view.subviews objectAtIndex:1];
    } else {
        contentView = [self.view.subviews objectAtIndex:0];
    }
    if (abool) {
        contentView.frame = CGRectMake(contentView.bounds.origin.x,  contentView.bounds.origin.y,  contentView.bounds.size.width, contentView.bounds.size.height + self.tabBar.frame.size.height);

    } else {
        contentView.frame = CGRectMake(contentView.bounds.origin.x, contentView.bounds.origin.y,  contentView.bounds.size.width, contentView.bounds.size.height - self.tabBar.frame.size.height);
    }
    tabBarView.hidden = abool;
}
说明:主要思路就是将改变内容视图的bounds,为其加上或者减去TabBar的高度。这里我在隐藏TabBar时做了延迟0.4秒的操作,是因为实际测试发现,在切换视图并且有动画效果时,上一个视图在离开屏幕的过程中下面的TabBar变成了黑色区域,如果延迟0.4秒就可以避免这样的问题,使隐藏效果也更加自然。

详细视图加载和退出时调用隐藏函数。分别如下:

    TabBarViewController *tabBarViewController = (TabBarViewController *)self.tabBarController;
    [tabBarViewController setTabBarHidden:YES];

    TabBarViewController *tabBarViewController = (TabBarViewController *)self.tabBarController;
    [tabBarViewController setTabBarHidden:NO];


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值