- 對(duì)于簡(jiǎn)單界面用xib直接創(chuàng)建肩榕,若覺(jué)得設(shè)置的圖片不符合自己的要求,或者是尺寸不符合要求氏捞,可以在代碼中進(jìn)行修改碧聪,比如,如下代碼
- (void)viewDidLoad {
[super viewDidLoad];
// 獲取按鈕的背景圖片
UIImage *image = _loginBtn.currentBackgroundImage;
// 將圖片進(jìn)行拉伸液茎。
image = [image stretchableImageWithLeftCapWidth:image.size.width * 0.5 topCapHeight:image.size.height * 0.5];
// 再將修改后的圖片賦值給按鈕
[_loginBtn setBackgroundImage:image forState:UIControlStateNormal];
}
-
對(duì)于一般界面的搭建逞姿,
- 一般采用xib/storyboard與純代碼共同搭建。
- 也就可以理解為豁护,
- 用xib搭建基本頁(yè)面哼凯,
- 代碼進(jìn)行輔助修改。實(shí)現(xiàn)一些效果楚里。
- 畢竟xib搭建的都是表面的,若想實(shí)現(xiàn)一些功能或者動(dòng)畫(huà)猎贴,以及等等班缎,都需要純代碼進(jìn)行編寫(xiě)蝴光。
-
比如
- stroyboard搭建具有靜態(tài)的cell的UItableViewController的控制器。并且完成了
沒(méi)有跳轉(zhuǎn)條件的segue
直接能夠push其他控制器 - 但還是需要進(jìn)行代碼的優(yōu)化达址,讓其能夠進(jìn)行更加絢麗的動(dòng)畫(huà)
- 需要注意的事蔑祟,storyboard中創(chuàng)建的cell沒(méi)有左滑刪除功能,只有純代碼根據(jù)模型創(chuàng)建的cell才有左滑刪除功能(沒(méi)有太多的驗(yàn)證沉唠,需要在進(jìn)行驗(yàn)證)
- 純代碼實(shí)現(xiàn)cell的移動(dòng)出現(xiàn)(從右邊推出)
- stroyboard搭建具有靜態(tài)的cell的UItableViewController的控制器。并且完成了
// 通常這個(gè)方法疆虚,用來(lái)做cell的動(dòng)畫(huà)
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
// 先將其平移至最右邊
cell.transform = CGAffineTransformMakeTranslation(self.view.width, 0);
[UIView animateWithDuration:0.5 animations:^{
// 再將所有形變量刪除,返回默認(rèn)狀態(tài)
cell.transform = CGAffineTransformIdentity;
}];
}
// 同樣也可以不使用平移满葛,直接移動(dòng)它的位置也可以
- (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);
}];
}
- 為了讓用戶有一個(gè)良好的體驗(yàn)径簿, 所以我們讓每次這個(gè)界面出現(xiàn)的時(shí)候就執(zhí)行這個(gè)動(dòng)畫(huà),所以調(diào)用刷新嘀韧,讓每次頁(yè)面即將出現(xiàn)的時(shí)候篇亭,來(lái)調(diào)用刷新,執(zhí)行動(dòng)畫(huà)(每次刷新锄贷,都有重新給cell賦值译蒂,其尺寸也會(huì)重新固定)
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.tableView reloadData];
}
- 對(duì)于push進(jìn)去的控制器,需要進(jìn)行額外的設(shè)置谊却,比如標(biāo)題柔昼,左右按鈕的樣式。
- 因?yàn)槿绻褂孟到y(tǒng)的UIButton來(lái)進(jìn)行設(shè)置的話炎辨,會(huì)造成右邊是圖片捕透,左邊是文字。(設(shè)置button時(shí)必須應(yīng)該設(shè)置尺寸)
- 只有通過(guò)自定義控件才能讓圖片和文字調(diào)換位置
- 關(guān)于自定義按鈕控件
- 思考 button控件 中 蹦魔,有圖片激率,和 文字, 只有將文字的起點(diǎn)x 取代 圖片的x勿决;并且讓圖片新位置的x 為文字的最大寬度即可乒躺。 文字的寬度隨文字的多少進(jìn)行改變。
- 關(guān)于按鈕的尺寸低缩,可以調(diào)用
- sizeToFit
進(jìn)行自適應(yīng)尺寸安排嘉冒。 - 主要代碼實(shí)現(xiàn)
// 布局子控件
- (void)layoutSubviews
{
[super layoutSubviews];
if (self.titleLabel.x > self.imageView.x) {
// 交換兩個(gè)子控件的位置
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);
}
}
// 思想:如果以后系統(tǒng)自帶的功能不滿足需求,就重寫(xiě)這個(gè)方法咆繁,添加額外的功能讳推,一定要記得還原之前的功能
- (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];
}
- 底部導(dǎo)航條
tabBar
的隱藏-
系統(tǒng)的tabBar的話, 在xib/storyboard中創(chuàng)建的控制器的話玩般,直接在右側(cè)欄中的
- 如果是純代碼創(chuàng)建的話银觅,直接調(diào)用
- hideBottomBarOnPush
進(jìn)行設(shè)置就行了。
-
- 本次項(xiàng)目中的是利用的自定義tabBar坏为,所以究驴,隱藏系統(tǒng)原有的tabBar是沒(méi)有作用的镊绪。(因?yàn)樽远x的tabBar,加入到了view當(dāng)中洒忧,是直接占據(jù)了原有tabBar的位置蝴韭。)
- 設(shè)想如果將自定義的tabBar,加到系統(tǒng)的tabBar內(nèi)熙侍。那么只要隱藏了系統(tǒng)的tabBar榄鉴,那么自定義的tabBar也就跟著隱藏了。 對(duì)于圖片超出尺寸問(wèn)題
只要?jiǎng)h除蛉抓,taBar內(nèi)不是自定義的view就行了 - 代碼實(shí)現(xiàn)
- 設(shè)想如果將自定義的tabBar,加到系統(tǒng)的tabBar內(nèi)熙侍。那么只要隱藏了系統(tǒng)的tabBar榄鉴,那么自定義的tabBar也就跟著隱藏了。 對(duì)于圖片超出尺寸問(wèn)題
#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];
// 移除系統(tǒng)tabBar上自帶的按鈕
for (UIView *childView in self.tabBar.subviews) {
// 只要不是自定義的tabBar庆尘,就給刪除
if (![childView isKindOfClass:[LXLTabBar class]]) {
[childView removeFromSuperview];
}
}
}
- 關(guān)于頂部導(dǎo)航條的返回按鈕
- 系統(tǒng)的返回按鈕為藍(lán)色的,不太好看芝雪。所以需要自己來(lái)進(jìn)行設(shè)置减余。
- 進(jìn)行設(shè)置navigationItem的leftBarButtonItem 上添加自定義的UIBarButtonItem,進(jìn)行圖片和方法的設(shè)定惩系。
- 由于是多出需要此種定義位岔,所以將其設(shè)置在push方法中,只有這樣的話堡牡,當(dāng)push進(jìn)一個(gè)控制器的時(shí)候抒抬,則對(duì)該控制器的返回按鈕進(jìn)行修改。
- 但要注意的是晤柄,根控制器也是push進(jìn)去的擦剑,所以需要進(jìn)行判斷,只要不是根控制器芥颈,就要進(jìn)行返回按鈕的設(shè)置惠勒。
- 但是,如果是自己設(shè)置的圖片和方法的話爬坑,那么就沒(méi)有了系統(tǒng)的左滑功能纠屋。此時(shí)如果想保留系統(tǒng)的左滑功能,需要做額外操作盾计。
- 返回功能一般保存在
self.interactivePopGestureRecognizer.delegate;
(交互手勢(shì)的代理)中售担,如果覆蓋了返回按鈕,那么就不會(huì)有滑動(dòng)功能署辉。所以需要在控制器加載的時(shí)候?qū)?code>交互手勢(shì)代理保存,可是對(duì)于根控制器族铆,不需要滑動(dòng),所以將交互手勢(shì)代理進(jìn)行賦原值哭尝。 對(duì)于非根控制器哥攘,賦值nil,讓其能夠跳轉(zhuǎn),不去執(zhí)行別的操作献丑。只有它為空的時(shí)候才能進(jìn)行滑動(dòng)操作末捣。
- 系統(tǒng)的返回按鈕為藍(lán)色的,不太好看芝雪。所以需要自己來(lái)進(jìn)行設(shè)置减余。
- (void)viewDidLoad {
[super viewDidLoad];
// 前提條件侠姑,覆蓋了系統(tǒng)的返回按鈕创橄,就不會(huì)有滑動(dòng)返回功能。
_popDelegate = self.interactivePopGestureRecognizer.delegate;
self.delegate = self;
}
// 監(jiān)聽(tīng)什么時(shí)候回到跟控制器
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if (viewController == self.childViewControllers[0]) { // 跟控制器
self.interactivePopGestureRecognizer.delegate = _popDelegate;
}else{
// 實(shí)現(xiàn)導(dǎo)航控制器的滑動(dòng)返回
self.interactivePopGestureRecognizer.delegate = nil;
}
NSLog(@"%@",viewController);
}
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
// viewController:棧頂控制器莽红,導(dǎo)航條的內(nèi)容是由棧頂控制器
// 設(shè)置導(dǎo)航條左邊按鈕,非根控制器才需要
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];
}
- 第二種方法
- 將系統(tǒng)的tabBar的主題顏色進(jìn)行改變,改成想顯示的顏色妥畏,然后把文字移除屏幕,移到用戶看不到的地方安吁。然后不用管系統(tǒng)的任何東西醉蚁。(只需要在用戶沒(méi)有看到屏幕顯示之前調(diào)用即可。)因?yàn)椴](méi)有覆蓋系統(tǒng)什么鬼店,指示調(diào)用了系統(tǒng)的方法网棍,將其文字的顯示位置進(jìn)行了改變。
- 代碼實(shí)現(xiàn)
+ (void)initialize
{
if(self == [XMGNavigationController class])
{...
// 獲取當(dāng)前類下的導(dǎo)航條
// self->XMGNavigationController
UINavigationBar *bar = [UINavigationBar appearanceWhenContainedIn:self, nil];
// ...
// 統(tǒng)一設(shè)置導(dǎo)航條按鈕的顏色
[bar setTintColor:[UIColor whiteColor]];
// 獲取UIBarButtonItem
UIBarButtonItem *item = [UIBarButtonItem appearanceWhenContainedIn:self, nil];
// 設(shè)置導(dǎo)航條返回按鈕的文字的位置
[item setBackButtonTitlePositionAdjustment:UIOffsetMake(0, -64) forBarMetrics:UIBarMetricsDefault];
}
}