第一個(gè)swift項(xiàng)目
最近參加比賽昨天剛剛結(jié)束休息一天泡宿舍寫下總結(jié)。來總結(jié)下我的第一個(gè)swift項(xiàng)目,由于之前寫項(xiàng)目都是用的oc,這是第一次寫項(xiàng)目很多swift項(xiàng)目的特性都沒用上(主要就會(huì)一點(diǎn)簡(jiǎn)單的語(yǔ)法) 這次項(xiàng)目總的來說還是很完美的畢竟是第一次用swift些項(xiàng)目,但是也有些許的不足比如說在做一個(gè)界面的時(shí)候想用到iOS9推出的堆棧視圖但是由于時(shí)間的原因沒有用上用了自己計(jì)算的布局勉強(qiáng)應(yīng)付上了但是效果很是不好啊,還有就是之前說的swift的特性,鏈?zhǔn)?面向協(xié)議都是知道的少之又少。接下來的時(shí)間打算好好總結(jié)下項(xiàng)目,繼續(xù)學(xué)習(xí)知識(shí)。
在做項(xiàng)目的過程中隨手記錄的(有些是oc的但是swift差不多):
關(guān)于隱藏tabbar的三種方法:
1.直接隱藏
// 顯示tabBar
self.tabBarController.tabBar.hidden = NO;
// 隱藏tabBar
self.tabBarController.tabBar.hidden = YES;
2.push的時(shí)候設(shè)置隱藏常用的尤其是在Nav和tab結(jié)合使用的時(shí)候
// 在push跳轉(zhuǎn)時(shí)隱藏tabBar
UIViewController *vc2 = [UIViewController new];
vc2.hidesBottomBarWhenPushed = YES;
[vc1 pushViewController:vc2 animated:YES];
3.沒有用過但是感覺很不錯(cuò)的方法
原理:UITabBarController的subview 共有兩個(gè),一個(gè)叫 UITabBar,就是底下的那個(gè) Bar;另一個(gè)叫UITranstionview,就是 Bar 上面的視圖。這兩個(gè) view 下面還有其他的subview,這就不用去管它了。把UITabBar的 y 向下移49個(gè)單位,把UITranstionview 的 hight 加長(zhǎng) 49 個(gè)單位。
- (void)hidesTabBar:(BOOL)hidden{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0];
for (UIView *view in self.tabBarController.view.subviews) {
if ([view isKindOfClass:[UITabBar class]]) {
if (hidden) {
[view setFrame:CGRectMake(view.frame.origin.x, [UIScreen mainScreen].bounds.size.height, view.frame.size.width , view.frame.size.height)];
}else{
[view setFrame:CGRectMake(view.frame.origin.x, [UIScreen mainScreen].bounds.size.height - 49, view.frame.size.width, view.frame.size.height)];
}
}else{
if([view isKindOfClass:NSClassFromString(@"UITransitionView")]){
if (hidden) {
[view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, [UIScreen mainScreen].bounds.size.height)];
}else{
[view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, [UIScreen mainScreen].bounds.size.height - 49 )];
}
}
}
}
[UIView commitAnimations];
}
-(void)makeTabBarHidden:(BOOL)hide { // Custom code to hide TabBar
if ( [self.tabBarController.view.subviews count] < 2 )
{
return;
}
UIView *contentView; if ( [[self.tabBarController.view.subviews objectAtIndex:0] isKindOfClass:[UITabBar class]] )
{
contentView = [self.tabBarController.view.subviews objectAtIndex:1];
} else {
contentView = [self.tabBarController.view.subviews objectAtIndex:0];
}
if (hide) {
contentView.frame = self.tabBarController.view.bounds;
} else {
contentView.frame = CGRectMake(self.tabBarController.view.bounds.origin.x, self.tabBarController.view.bounds.origin.y,
self.tabBarController.view.bounds.size.width, self.tabBarController.view.bounds.size.height -
self.tabBarController.tabBar.frame.size.height);
}
self.tabBarController.tabBar.hidden = hide;
}
關(guān)于swift的協(xié)議問題
1.聲明除了語(yǔ)法與oc幾乎一樣 而且更加簡(jiǎn)單
2.在聲明上的區(qū)別
//特殊的聲明方式
@objc protocol FirstViewControllerDelegate: NSObjectProtocol{
optional func firstDelegate(returnString:String)
}
在這個(gè)代理的聲明中,可以明顯看出,增加了一些額外的修飾符
1》引入@objc是為了引入 optional(可選),用 optional 修飾代理方法,那么這個(gè)方法就變成可選方法,無(wú)論在代理對(duì)象中是否實(shí)現(xiàn),都不受影響。
2》引入 NSObjectProtocol 是因?yàn)槲覀內(nèi)绻胗?weak 修飾代理屬性,需要繼承自這個(gè)類。
關(guān)于切換根視圖(登陸后切換根視圖)
1.在appdelegate中
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
A *vc = [[A alloc] init]; // init會(huì)執(zhí)行viewDidLoad viewWillAppear
vc.view.backgroundColor = [UIColor redColor];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
2.在a中 b設(shè)置為根視圖
注意點(diǎn)出來了,如果使用的是presentViewController則在設(shè)置B為根控制器的方法就必須在viewDidLoad與viewWillAppear之后進(jìn)行設(shè)置。不然如下
3.在b中設(shè)置b為根視圖
(建議在控制器已經(jīng)完全在window上展示再切換window的根控制器)
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
AppDelegate *app = [UIApplication sharedApplication].delegate; // 獲取當(dāng)前app單例
NSLog(@"appdelegate is %@",app);
UIViewController *vc = app.window.rootViewController;
app.window.rootViewController = self;
[vc removeFromParentViewController];
NSLog(@"當(dāng)前的根控制器為:%@",self.view.window.rootViewController);
}
A.view = nil
對(duì)應(yīng)上面的方法需要將A銷毀減小內(nèi)存的消耗
還有一種方法
方法二:(提供個(gè)基本思路,實(shí)際情況大家研究下了)
可以創(chuàng)建多個(gè)window,在執(zhí)行完成后可以設(shè)置其window為self.window,并讓其成為key window,然后只要想使用的話就只可以將self.window賦值想要展示的window可此時(shí)銷毀剛才的window,然后再將[self.window makeKeyandVisible];
關(guān)于tableView 的cell被遮擋的問題
1.沒有正確設(shè)置tableVIew的高度,高度過高
tableview的高度設(shè)置有錯(cuò)誤,應(yīng)該為self.view.frame.size.hight - self.tabbarController.tabbar.frame.size.height - 64,就可以避免遮擋
或者
self.automaticallyAdjustsScrollViewInsets = NO 設(shè)置后默認(rèn)tableview 的contentInset = UIEdgeInsetsZero; 否則就是會(huì)減去 導(dǎo)航欄 + 底部tababr 高度,如果要從頭開始布局 ,可以使用self.edgesForExtendedLayout = UIRectEdgeTop; 讓tableview 頂部從 0 。0 開始布局,底部自動(dòng)減去 64
關(guān)于導(dǎo)航欄的問題
- self.navigationController?.setNavigationBarHidden(false, animated: true)
- 設(shè)置viewController的title和設(shè)置UItabbarItem的標(biāo)題
在寫代碼的時(shí)候設(shè)計(jì)的基類修改標(biāo)題欄的方法采用的是self.title = navString 但是在實(shí)際的使用的中發(fā)現(xiàn),我調(diào)用這個(gè)方法的時(shí)候出現(xiàn)了在我底部的TABbar產(chǎn)生了一個(gè)新的item,當(dāng)時(shí)以為我自定義的tabbar出現(xiàn)了問題但是找了一圈沒找到。。。。然后百度下找到了我想要的一切
self.navigationItem.title
= @"my title"; sets navigation bar title.
self.tabBarItem.title
= @"my title"; sets tab bar title.
self.title
= @"my title"; sets both of these.
關(guān)于寫界面的一點(diǎn)提醒
- 當(dāng)寫界面的的時(shí)候出現(xiàn)了不符合自己的意圖的樣子,可以進(jìn)行查看分層和設(shè)置背景顏色的方法來進(jìn)行調(diào)試或者可以frameDebuging(真機(jī))
關(guān)于調(diào)用父類方法(調(diào)用自定義tabbar方法)
let tab = self.navigationController?.tabBarController as! AnimationTabBarController
// 獲取父類的方法
// print(self.navigationController?.tabBarController?.superclass ?? AnyClass.self)
// 調(diào)用父類的方法
tab.setSelectIndex(from: 0, to: 2)
關(guān)于hidden隱藏時(shí)的動(dòng)畫
let animation = CATransition()
animation.type = kCATransitionFade
animation.duration = 0.4
view.layer.add(animation, forKey: nil)
view.isHidden = false
關(guān)于swift數(shù)組切片
1.原網(wǎng)址
嘗試了好幾種辦法但是最終都沒有解決,與這個(gè)博客遇到的問題差不多,我遇到的問題是將數(shù)組分成幾個(gè)分別出作為數(shù)據(jù)源(因?yàn)槲覍懙孽磕_的接口弄的不會(huì)分開)
最終的實(shí)現(xiàn)辦法
memberIdStrListToProcess = Array(groupMemberIdStrList[0…9])
要加一個(gè)array然后再接片操作跟Python有些不同。(前面加了Array強(qiáng)轉(zhuǎn))
關(guān)于數(shù)組
1.今天在創(chuàng)建數(shù)組然后從網(wǎng)絡(luò)獲取數(shù)據(jù)并添加到數(shù)組的時(shí)候出現(xiàn)了問題。。。
我是這樣寫的
var recordData = Array<Array<Any>>()
犯了一個(gè)明顯的錯(cuò)誤。。。沒有進(jìn)行初始化這是單單的進(jìn)行了聲明。。因?yàn)閟wift的語(yǔ)法搞得我有點(diǎn)忘記初始化了。。總結(jié)下
數(shù)據(jù)數(shù)組 記得創(chuàng)建是要進(jìn)行初始化(創(chuàng)建類型要: 聲明但是沒有初始化,= ( )這樣是進(jìn)行初始化并聲明 !) 括號(hào)的問題
swift調(diào)用oc的block
1.swift調(diào)用oc的block,遇到這個(gè)問題我有點(diǎn)頭大啊。。。oc的block還沒學(xué)多好呢。。swift更是差勁現(xiàn)在可以好了直接開始混編了,說正題,解決方法swift調(diào)用ocBlock 總結(jié)如下
// oc的block
返回值(^名稱)(類型 傳值)
// swift里調(diào)用
名稱 = {(傳值!!(沒有類型))->(返回值) in
}
2.還有一點(diǎn)之前看的swift調(diào)用不了oc的可選協(xié)議。好像有辦法但是時(shí)間緊迫先放過了。()
oc設(shè)置導(dǎo)航欄文字富文本顯示
設(shè)置富文本將以字典的樣子去設(shè)置
[self.navigationController.navigationBar setTitleTextAttributes:
@{NSFontAttributeName:[UIFont systemFontOfSize:19],
NSForegroundColorAttributeName:[UIColor redColor]}];
將圖片轉(zhuǎn)成base64字符串
let image = UIImage(name:"照片")
//將圖片轉(zhuǎn)成data
let imageData = UIImagePNGRepresentation(image!)
//將data轉(zhuǎn)成base64的字符串
let imageBase64String = imageData?.base64EncodeString()
//可以使用base64的字符串類型上傳到服務(wù)器了
//還要將base64進(jìn)行urlencode的話
let imageString = imageBase64String.addingPercentEncoding(withAllowedCharacters: .alphanumerics)
bas64字符串轉(zhuǎn)成圖片
//將base64的圖片字符串轉(zhuǎn)成Data
let imageData2 = Data(base64Encoded: imageBase64String!)
//將data轉(zhuǎn)成照片
let image2 =UIImage(data:imageData2!)
//將data轉(zhuǎn)成uiimage
let photo = UIImage(data:image2)
ios11 保存圖片閃退
原文
ios10和ios11 的這個(gè)方面的權(quán)限有些不同查看博客即可
設(shè)置狀態(tài)欄設(shè)置
首先放出幾個(gè)網(wǎng)上寫的不錯(cuò)的博客吧ios 狀態(tài)欄statusBar的背景顏色
//設(shè)置狀態(tài)欄顏色
- (void)setStatusBarBackgroundColor:(UIColor *)color {
UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];
if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
statusBar.backgroundColor = color;
}
}
- (void)viewDidLoad {
[super viewDidLoad];
[self setStatusBarBackgroundColor:[UIColor redColor]];
self.view.backgroundColor = [UIColor yellowColor];
}
swift實(shí)現(xiàn)的
還有好多但是不服我的情況我就直接刪除了。。。說下我的情況吧 我的程序運(yùn)行在ios11 上是完全ok的 但是運(yùn)行在ios9上狀態(tài)欄莫名的就是黑色的。。。后來發(fā)現(xiàn)是我自定義的導(dǎo)航欄的位置出現(xiàn)了問題 少算了20.。汗顏啊。~
ios 截屏保存相冊(cè)(swift)版
tableView顯示滑動(dòng)條
self.lazyTableView.showsHorizontalScrollIndicator為顯示橫向的滑動(dòng)條(Heng)
self.lazyTableView.showsVerticalScrollIndicator
為顯示縱向的滑動(dòng)條 其實(shí)沒必要去記錄的自己試下就可以啦
ios設(shè)置返回按鈕的樣子自定義(oc版)
ios修改返回按鈕的幾種方式嘗試了下最后一種方式最好用了,之前的方法都是更改了圖片但是標(biāo)題沒有發(fā)生改變,采用第三種方法
//創(chuàng)建一個(gè)UIButton
UIButton *backButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 40, 40)];
//設(shè)置UIButton的圖像
[backButton setImage:[UIImage imageNamed:@"left_select_img.png"] forState:UIControlStateNormal];
//給UIButton綁定一個(gè)方法,在這個(gè)方法中進(jìn)行popViewControllerAnimated
[backButton addTarget:self action:@selector(backItemClick) forControlEvents:UIControlEventTouchUpInside];
//然后通過系統(tǒng)給的自定義BarButtonItem的方法創(chuàng)建BarButtonItem
UIBarButtonItem *backItem = [[UIBarButtonItem alloc]initWithCustomView:backButton];
//覆蓋返回按鍵
self.navigationItem.leftBarButtonItem = backItem;
等間距布局(堆棧視圖)
PHP的數(shù)組
1.首先是數(shù)組支持的類型,PHP的數(shù)組有兩種類型,第一種只保存值的索引數(shù)組,另一種是保存名值對(duì)(name/key)關(guān)聯(lián)數(shù)組(類似其他語(yǔ)言的字典)
Linux導(dǎo)入數(shù)據(jù)庫(kù)
之前有用過但是又忘記了。。在此記錄下吧首先導(dǎo)出所需要的數(shù)據(jù)庫(kù),我用的是Navicat直接右鍵導(dǎo)出就OK了,然后是在服務(wù)器上導(dǎo)入,服務(wù)器為centos導(dǎo)入方法有兩種。第一種方法:
選擇數(shù)據(jù)庫(kù)
mysql>use abc;
設(shè)置數(shù)據(jù)庫(kù)編碼
mysql>set names utf8;
導(dǎo)入數(shù)據(jù)(注意sql文件的路徑)
mysql>source /home/abc/abc.sql;
第二種方法(常用方法)
方法二(常用):
格式:mysql -u用戶名 -p密碼 數(shù)據(jù)庫(kù)名 < 數(shù)據(jù)庫(kù)名.sql
舉例:mysql -uabc_f -p abc < abc.sql
順便記錄下導(dǎo)出的方法:
一、導(dǎo)出數(shù)據(jù)和表結(jié)構(gòu):
格式: mysqldump -u用戶名 -p密碼 數(shù)據(jù)庫(kù)名 > 數(shù)據(jù)庫(kù)名.sql
舉例: /usr/local/mysql/bin/ mysqldump -uroot -p abc > abc.sql
敲回車后會(huì)提示輸入密碼
二、只導(dǎo)出表結(jié)構(gòu)
格式:mysqldump -u用戶名 -p密碼 -d 數(shù)據(jù)庫(kù)名 > 數(shù)據(jù)庫(kù)名.sql
舉例:/usr/local/mysql/bin/ mysqldump -uroot -p -d abc > abc.sql
注:/usr/local/mysql/bin/ —> mysql的data目錄
遇到的重大問題
1.自定義tabbar總是出問題 最終是修改一個(gè)屬性解決的
2.方法前面加objc
3.持續(xù)更新 繼續(xù)干找問題記錄下來 學(xué)習(xí) 研究 抽時(shí)間
總結(jié)
1.第一次用些swift些項(xiàng)目,第一次用PHP做了些簡(jiǎn)單的app的接口~總的來說還是很開心的
后記
1.iOS oc方面:kvo屬性監(jiān)聽,通知的寫法,block的用法,了解runtime,wkwebView有很多的知識(shí)點(diǎn)
iOS swift方面: swift閉包知識(shí),wkwebView有很多的知識(shí)點(diǎn),事件的分發(fā)機(jī)制,通知,學(xué)習(xí)rxswift swift 閉包的使用
2.學(xué)習(xí)工具: sketch還有和他配好寫動(dòng)畫的叫。。。
3.學(xué)習(xí)控件堆棧視圖:UIStackView UIStackView Intrinsic Content Size
4.學(xué)習(xí)了解本地?cái)?shù)據(jù)庫(kù) realm charts(畫圖)點(diǎn)的擬合
5.后續(xù)將這些東西的學(xué)習(xí)筆記和demon上傳
總結(jié)下
上面的都是在所項(xiàng)目的時(shí)候記錄的一些東西,接下來的一個(gè)月里面有幾件事情要去忙首先是參加cccc然后是小程序再有就是將這個(gè)項(xiàng)目繼續(xù)完成升級(jí),然后學(xué)習(xí)上面提到的東西。陸續(xù)我要記錄下我學(xué)習(xí)的這些知識(shí)。 好了就這樣了,最后分享下項(xiàng)目吧 GitHub項(xiàng)目地址()