第一個swift項目
最近參加比賽昨天剛剛結(jié)束休息一天泡宿舍寫下總結(jié)湾趾。來總結(jié)下我的第一個swift項目和蚪,由于之前寫項目都是用的oc载矿,這是第一次寫項目很多swift項目的特性都沒用上(主要就會一點簡單的語法) 這次項目總的來說還是很完美的畢竟是第一次用swift些項目,但是也有些許的不足比如說在做一個界面的時候想用到iOS9推出的堆棧視圖但是由于時間的原因沒有用上用了自己計算的布局勉強應(yīng)付上了但是效果很是不好啊梧奢,還有就是之前說的swift的特性担神,鏈式 面向協(xié)議都是知道的少之又少楼吃。接下來的時間打算好好總結(jié)下項目,繼續(xù)學(xué)習(xí)知識妄讯。
在做項目的過程中隨手記錄的(有些是oc的但是swift差不多):
關(guān)于隱藏tabbar的三種方法:
1.直接隱藏
// 顯示tabBar
self.tabBarController.tabBar.hidden = NO;
// 隱藏tabBar
self.tabBarController.tabBar.hidden = YES;
2.push的時候設(shè)置隱藏常用的尤其是在Nav和tab結(jié)合使用的時候
// 在push跳轉(zhuǎn)時隱藏tabBar
UIViewController *vc2 = [UIViewController new];
vc2.hidesBottomBarWhenPushed = YES;
[vc1 pushViewController:vc2 animated:YES];
3.沒有用過但是感覺很不錯的方法
原理:UITabBarController的subview 共有兩個孩锡,一個叫 UITabBar,就是底下的那個 Bar捞挥;另一個叫UITranstionview,就是 Bar 上面的視圖忧吟。這兩個 view 下面還有其他的subview砌函,這就不用去管它了。把UITabBar的 y 向下移49個單位溜族,把UITranstionview 的 hight 加長 49 個單位讹俊。
- (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.聲明除了語法與oc幾乎一樣 而且更加簡單
2.在聲明上的區(qū)別
//特殊的聲明方式
@objc protocol FirstViewControllerDelegate: NSObjectProtocol{
optional func firstDelegate(returnString:String)
}
在這個代理的聲明中,可以明顯看出煌抒,增加了一些額外的修飾符
1》引入@objc是為了引入 optional(可選)仍劈,用 optional 修飾代理方法,那么這個方法就變成可選方法寡壮,無論在代理對象中是否實現(xiàn)贩疙,都不受影響讹弯。
2》引入 NSObjectProtocol 是因為我們?nèi)绻胗?weak 修飾代理屬性,需要繼承自這個類这溅。
關(guān)于切換根視圖(登陸后切換根視圖)
1.在appdelegate中
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
A *vc = [[A alloc] init]; // init會執(zhí)行viewDidLoad viewWillAppear
vc.view.backgroundColor = [UIColor redColor];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
2.在a中 b設(shè)置為根視圖
注意點出來了组民,如果使用的是presentViewController則在設(shè)置B為根控制器的方法就必須在viewDidLoad與viewWillAppear之后進行設(shè)置。不然如下
3.在b中設(shè)置b為根視圖
(建議在控制器已經(jīng)完全在window上展示再切換window的根控制器)
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
AppDelegate *app = [UIApplication sharedApplication].delegate; // 獲取當前app單例
NSLog(@"appdelegate is %@",app);
UIViewController *vc = app.window.rootViewController;
app.window.rootViewController = self;
[vc removeFromParentViewController];
NSLog(@"當前的根控制器為:%@",self.view.window.rootViewController);
}
A.view = nil
對應(yīng)上面的方法需要將A銷毀減小內(nèi)存的消耗
還有一種方法
方法二:(提供個基本思路悲靴,實際情況大家研究下了)
可以創(chuàng)建多個window臭胜,在執(zhí)行完成后可以設(shè)置其window為self.window,并讓其成為key window癞尚,然后只要想使用的話就只可以將self.window賦值想要展示的window可此時銷毀剛才的window耸三,然后再將[self.window makeKeyandVisible];
關(guān)于tableView 的cell被遮擋的問題
1.沒有正確設(shè)置tableVIew的高度,高度過高
tableview的高度設(shè)置有錯誤,應(yīng)該為self.view.frame.size.hight - self.tabbarController.tabbar.frame.size.height - 64,就可以避免遮擋
或者
self.automaticallyAdjustsScrollViewInsets = NO 設(shè)置后默認tableview 的contentInset = UIEdgeInsetsZero; 否則就是會減去 導(dǎo)航欄 + 底部tababr 高度浇揩,如果要從頭開始布局 仪壮,可以使用self.edgesForExtendedLayout = UIRectEdgeTop; 讓tableview 頂部從 0 。0 開始布局临燃,底部自動減去 64
關(guān)于導(dǎo)航欄的問題
- self.navigationController?.setNavigationBarHidden(false, animated: true)
- 設(shè)置viewController的title和設(shè)置UItabbarItem的標題
在寫代碼的時候設(shè)計的基類修改標題欄的方法采用的是self.title = navString 但是在實際的使用的中發(fā)現(xiàn)睛驳,我調(diào)用這個方法的時候出現(xiàn)了在我底部的TABbar產(chǎn)生了一個新的item,當時以為我自定義的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)于寫界面的一點提醒
- 當寫界面的的時候出現(xiàn)了不符合自己的意圖的樣子蹬跃,可以進行查看分層和設(shè)置背景顏色的方法來進行調(diào)試或者可以frameDebuging(真機)
關(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隱藏時的動畫
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)址
嘗試了好幾種辦法但是最終都沒有解決,與這個博客遇到的問題差不多铆铆,我遇到的問題是將數(shù)組分成幾個分別出作為數(shù)據(jù)源(因為我寫的蹩腳的接口弄的不會分開)
最終的實現(xiàn)辦法
memberIdStrListToProcess = Array(groupMemberIdStrList[0…9])
要加一個array然后再接片操作跟Python有些不同蝶缀。(前面加了Array強轉(zhuǎn))
關(guān)于數(shù)組
1.今天在創(chuàng)建數(shù)組然后從網(wǎng)絡(luò)獲取數(shù)據(jù)并添加到數(shù)組的時候出現(xiàn)了問題。薄货。翁都。
我是這樣寫的
var recordData = Array<Array<Any>>()
犯了一個明顯的錯誤。谅猾。柄慰。沒有進行初始化這是單單的進行了聲明。税娜。因為swift的語法搞得我有點忘記初始化了坐搔。【淳兀總結(jié)下
數(shù)據(jù)數(shù)組 記得創(chuàng)建是要進行初始化(創(chuàng)建類型要: 聲明但是沒有初始化概行,= ( )這樣是進行初始化并聲明 !) 括號的問題
swift調(diào)用oc的block
1.swift調(diào)用oc的block弧岳,遇到這個問題我有點頭大啊凳忙。业踏。。oc的block還沒學(xué)多好呢消略。堡称。swift更是差勁現(xiàn)在可以好了直接開始混編了,說正題艺演,解決方法swift調(diào)用ocBlock 總結(jié)如下
// oc的block
返回值(^名稱)(類型 傳值)
// swift里調(diào)用
名稱 = {(傳值!!(沒有類型))->(返回值) in
}
2.還有一點之前看的swift調(diào)用不了oc的可選協(xié)議却紧。好像有辦法但是時間緊迫先放過了。()
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進行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 的這個方面的權(quán)限有些不同查看博客即可
設(shè)置狀態(tài)欄設(shè)置
首先放出幾個網(wǎng)上寫的不錯的博客吧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實現(xiàn)的
還有好多但是不服我的情況我就直接刪除了胎撤。晓殊。。說下我的情況吧 我的程序運行在ios11 上是完全ok的 但是運行在ios9上狀態(tài)欄莫名的就是黑色的伤提。巫俺。。后來發(fā)現(xiàn)是我自定義的導(dǎo)航欄的位置出現(xiàn)了問題 少算了20.肿男。汗顏啊介汹。~
ios 截屏保存相冊(swift)版
tableView顯示滑動條
self.lazyTableView.showsHorizontalScrollIndicator為顯示橫向的滑動條(Heng)
self.lazyTableView.showsVerticalScrollIndicator
為顯示縱向的滑動條 其實沒必要去記錄的自己試下就可以啦
ios設(shè)置返回按鈕的樣子自定義(oc版)
ios修改返回按鈕的幾種方式嘗試了下最后一種方式最好用了,之前的方法都是更改了圖片但是標題沒有發(fā)生改變舶沛,采用第三種方法
//創(chuàng)建一個UIButton
UIButton *backButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 40, 40)];
//設(shè)置UIButton的圖像
[backButton setImage:[UIImage imageNamed:@"left_select_img.png"] forState:UIControlStateNormal];
//給UIButton綁定一個方法嘹承,在這個方法中進行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ù)組叹卷,另一種是保存名值對(name/key)關(guān)聯(lián)數(shù)組(類似其他語言的字典)
Linux導(dǎo)入數(shù)據(jù)庫
之前有用過但是又忘記了。坪它。在此記錄下吧首先導(dǎo)出所需要的數(shù)據(jù)庫骤竹,我用的是Navicat直接右鍵導(dǎo)出就OK了,然后是在服務(wù)器上導(dǎo)入往毡,服務(wù)器為centos導(dǎo)入方法有兩種蒙揣。第一種方法:
選擇數(shù)據(jù)庫
mysql>use abc;
設(shè)置數(shù)據(jù)庫編碼
mysql>set names utf8;
導(dǎo)入數(shù)據(jù)(注意sql文件的路徑)
mysql>source /home/abc/abc.sql;
第二種方法(常用方法)
方法二(常用):
格式:mysql -u用戶名 -p密碼 數(shù)據(jù)庫名 < 數(shù)據(jù)庫名.sql
舉例:mysql -uabc_f -p abc < abc.sql
順便記錄下導(dǎo)出的方法:
一、導(dǎo)出數(shù)據(jù)和表結(jié)構(gòu):
格式: mysqldump -u用戶名 -p密碼 數(shù)據(jù)庫名 > 數(shù)據(jù)庫名.sql
舉例: /usr/local/mysql/bin/ mysqldump -uroot -p abc > abc.sql
敲回車后會提示輸入密碼
二开瞭、只導(dǎo)出表結(jié)構(gòu)
格式:mysqldump -u用戶名 -p密碼 -d 數(shù)據(jù)庫名 > 數(shù)據(jù)庫名.sql
舉例:/usr/local/mysql/bin/ mysqldump -uroot -p -d abc > abc.sql
注:/usr/local/mysql/bin/ —> mysql的data目錄
遇到的重大問題
1.自定義tabbar總是出問題 最終是修改一個屬性解決的
2.方法前面加objc
3.持續(xù)更新 繼續(xù)干找問題記錄下來 學(xué)習(xí) 研究 抽時間
總結(jié)
1.第一次用些swift些項目懒震,第一次用PHP做了些簡單的app的接口~總的來說還是很開心的
后記
1.iOS oc方面:kvo屬性監(jiān)聽,通知的寫法惩阶,block的用法挎狸,了解runtime扣汪,wkwebView有很多的知識點
iOS swift方面: swift閉包知識断楷,wkwebView有很多的知識點,事件的分發(fā)機制崭别,通知冬筒,學(xué)習(xí)rxswift swift 閉包的使用
2.學(xué)習(xí)工具: sketch還有和他配好寫動畫的叫恐锣。。舞痰。
3.學(xué)習(xí)控件堆棧視圖:UIStackView UIStackView Intrinsic Content Size
4.學(xué)習(xí)了解本地數(shù)據(jù)庫 realm charts(畫圖)點的擬合
5.后續(xù)將這些東西的學(xué)習(xí)筆記和demon上傳
總結(jié)下
上面的都是在所項目的時候記錄的一些東西土榴,接下來的一個月里面有幾件事情要去忙首先是參加cccc然后是小程序再有就是將這個項目繼續(xù)完成升級,然后學(xué)習(xí)上面提到的東西响牛。陸續(xù)我要記錄下我學(xué)習(xí)的這些知識玷禽。 好了就這樣了,最后分享下項目吧 GitHub項目地址()