界面的搭建

  • 对于简单界面用xib直接创建,若觉得设置的图片不符合自己的要求,或者是尺寸不符合要求,可以在代码中进行修改,比如,如下代码
- (void)viewDidLoad {
    [super viewDidLoad];
        // 获取按钮的背景图片
    UIImage *image =  _loginBtn.currentBackgroundImage;
    // 将图片进行拉伸。
    image = [image stretchableImageWithLeftCapWidth:image.size.width * 0.5 topCapHeight:image.size.height * 0.5];
    // 再将修改后的图片赋值给按钮
    [_loginBtn setBackgroundImage:image forState:UIControlStateNormal];
}

  • 对于一般界面的搭建,

    • 一般采用xib/storyboard与纯代码共同搭建。
    • 也就可以理解为,
      • 用xib搭建基本页面,
      • 代码进行辅助修改。实现一些效果。
      • 毕竟xib搭建的都是表面的,若想实现一些功能或者动画,以及等等,都需要纯代码进行编写。
  • 比如

    • stroyboard搭建具有静态的cell的UItableViewController的控制器。并且完成了没有跳转条件的segue直接能够push其他控制器
    • 但还是需要进行代码的优化,让其能够进行更加绚丽的动画
    • 需要注意的事,storyboard中创建的cell没有左滑删除功能,只有纯代码根据模型创建的cell才有左滑删除功能(没有太多的验证,需要在进行验证)
    • 纯代码实现cell的移动出现(从右边推出)
// 通常这个方法,用来做cell的动画
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 先将其平移至最右边
    cell.transform = CGAffineTransformMakeTranslation(self.view.width, 0);

    [UIView animateWithDuration:0.5 animations:^{
    // 再将所有形变量删除,返回默认状态
        cell.transform = CGAffineTransformIdentity;
    }];
}


// 同样也可以不使用平移,直接移动它的位置也可以
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    cell.center = CGPointMake(self.view.width, 0);

    [UIView animateWithDuration:0.5 animations:^{
        cell.center = CGPointMake(0, 0);
    }];
}

  • 为了让用户有一个良好的体验, 所以我们让每次这个界面出现的时候就执行这个动画,所以调用刷新,让每次页面即将出现的时候,来调用刷新,执行动画(每次刷新,都有重新给cell赋值,其尺寸也会重新固定)
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [self.tableView reloadData];
}
  • 对于push进去的控制器,需要进行额外的设置,比如标题,左右按钮的样式。
  • 因为如果使用系统的UIButton来进行设置的话,会造成右边是图片,左边是文字。(设置button时必须应该设置尺寸)
  • 只有通过自定义控件才能让图片和文字调换位置
  • 关于自定义按钮控件
    • 思考 button控件 中 ,有图片,和 文字, 只有将文字的起点x 取代 图片的x;并且让图片新位置的x 为文字的最大宽度即可。 文字的宽度随文字的多少进行改变。
    • 关于按钮的尺寸,可以调用- sizeToFit进行自适应尺寸安排。
    • 主要代码实现
// 布局子控件
- (void)layoutSubviews
{
    [super layoutSubviews];


    if (self.titleLabel.x > self.imageView.x) {
        // 交换两个子控件的位置
        self.titleLabel.x = self.imageView.x;

        NSLog(@"titleLabel-%f",self.titleLabel.x);
    // self.imageView.x = self.titleLabel.width;
        self.imageView.x = CGRectGetMaxX(self.titleLabel.frame);
        [self sizeToFit];
        NSLog(@"imageView-%f",self.imageView.x);

    }

}



// 思想:如果以后系统自带的功能不满足需求,就重写这个方法,添加额外的功能,一定要记得还原之前的功能
- (void)setTitle:(NSString *)title forState:(UIControlState)state
{
    [super setTitle:title forState:state];

    [self sizeToFit];
}

- (void)setImage:(UIImage *)image forState:(UIControlState)state
{
    [super setImage:image forState:state];
    [self sizeToFit];
}

  • 底部导航条tabBar的隐藏
    • 系统的tabBar的话, 在xib/storyboard中创建的控制器的话,直接在右侧栏中的


      Snip20150725_13.png
    • 如果是纯代码创建的话,直接调用 - hideBottomBarOnPush进行设置就行了。
  • 本次项目中的是利用的自定义tabBar,所以,隐藏系统原有的tabBar是没有作用的。(因为自定义的tabBar,加入到了view当中,是直接占据了原有tabBar的位置。)
    • 设想如果将自定义的tabBar,加到系统的tabBar内。那么只要隐藏了系统的tabBar,那么自定义的tabBar也就跟着隐藏了。 对于图片超出尺寸问题
      只要删除,taBar内不是自定义的view就行了
    • 代码实现
#pragma mark - 自定义tabBar
- (void)setUpTabBar
{


    // 2.添加自己的tabBar
    LXLTabBar *tabBar = [[LXLTabBar alloc] init];

    ...

    tabBar.frame = self.tabBar.bounds;

    [self.tabBar addSubview:tabBar];

}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    // 移除系统tabBar上自带的按钮
    for (UIView *childView in self.tabBar.subviews) {
    // 只要不是自定义的tabBar,就给删除
        if (![childView isKindOfClass:[LXLTabBar class]]) {
            [childView removeFromSuperview];
        }

    }
}

  • 关于顶部导航条的返回按钮
    • 系统的返回按钮为蓝色的,不太好看。所以需要自己来进行设置。
      • 进行设置navigationItem的leftBarButtonItem 上添加自定义的UIBarButtonItem,进行图片和方法的设定。
      • 由于是多出需要此种定义,所以将其设置在push方法中,只有这样的话,当push进一个控制器的时候,则对该控制器的返回按钮进行修改。
      • 但要注意的是,根控制器也是push进去的,所以需要进行判断,只要不是根控制器,就要进行返回按钮的设置。
      • 但是,如果是自己设置的图片和方法的话,那么就没有了系统的左滑功能。此时如果想保留系统的左滑功能,需要做额外操作。
      • 返回功能一般保存在self.interactivePopGestureRecognizer.delegate;(交互手势的代理)中,如果覆盖了返回按钮,那么就不会有滑动功能。所以需要在控制器加载的时候将交互手势代理保存,可是对于根控制器,不需要滑动,所以将交互手势代理进行赋原值。 对于非根控制器,赋值nil,让其能够跳转,不去执行别的操作。只有它为空的时候才能进行滑动操作。
- (void)viewDidLoad {
    [super viewDidLoad];
    // 前提条件,覆盖了系统的返回按钮,就不会有滑动返回功能。

    _popDelegate = self.interactivePopGestureRecognizer.delegate;


    self.delegate = self;

}
// 监听什么时候回到跟控制器
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (viewController == self.childViewControllers[0]) { // 跟控制器
        self.interactivePopGestureRecognizer.delegate = _popDelegate;
    }else{
        // 实现导航控制器的滑动返回
        self.interactivePopGestureRecognizer.delegate = nil;
    }
    NSLog(@"%@",viewController);
}

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    // viewController:栈顶控制器,导航条的内容是由栈顶控制器

    // 设置导航条左边按钮,非根控制器才需要
    if (self.childViewControllers.count != 0) { // 非根控制器

        viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageWithOriginRenderingName:@"NavBack"] style:UIBarButtonItemStyleBordered target:self action:@selector(back)];
    }

    [super pushViewController:viewController animated:animated];
}

- (void)back
{
    [self popViewControllerAnimated:YES];
}
  • 第二种方法
    • 将系统的tabBar的主题颜色进行改变,改成想显示的颜色,然后把文字移除屏幕,移到用户看不到的地方。然后不用管系统的任何东西。(只需要在用户没有看到屏幕显示之前调用即可。)因为并没有覆盖系统什么,指示调用了系统的方法,将其文字的显示位置进行了改变。
    • 代码实现
+ (void)initialize
{
    if(self == [XMGNavigationController class])
    {...
    // 获取当前类下的导航条
    // self->XMGNavigationController
    UINavigationBar *bar = [UINavigationBar appearanceWhenContainedIn:self, nil];
    // ...
    // 统一设置导航条按钮的颜色
    [bar setTintColor:[UIColor whiteColor]];

    // 获取UIBarButtonItem
    UIBarButtonItem *item = [UIBarButtonItem appearanceWhenContainedIn:self, nil];

    // 设置导航条返回按钮的文字的位置
    [item setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -64) forBarMetrics:UIBarMetricsDefault];
    }

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容