-
Notifications
You must be signed in to change notification settings - Fork 376
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Beginning iOS 8 Programming with Swift 读书笔记 #26
Comments
哈哈,哥,真好,我自己买了这本书的电子版,纯英文的,看不懂,想问问你autolayout这个怎么搞,我的swift App图片显示的时候iPhone5s上显示满屏,但是到6的时候就显示没有铺满屏幕,这个我还是不知道怎么去解决! |
@saraOrg 添加左右上下的 约束 |
哥 给个图片吧 我看不懂! |
GOOD!!!! |
well done |
帅哥,这书能出售份给我吗? |
你好 我在实践原书案例第11章内容时,遇到一个闪退的问题,详细的问题描述已经mail给你,能不能帮我看一下?谢谢! |
哥,webview的加载进度怎么去模拟,我现在用webview去显示网页,要加个进度条,然后在网页加载的时候 去不断用进度条展示网页加载的进度 类似微博app打开链接的效果,不知道这个你没有什么好的思路给兄弟推荐一下! |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
1. 设置图片圆角
2. UIAlertController
声明并创建闭包,填充UIAlertAction的handler
直接使用闭包,填充UIAlertAction的handler
3. 批量初始化一个数组
4. 隐藏状态栏
info.plist文件中,View controller-based status bar appearance项设为YES,则View controller对status bar的设置优先级高于application的设置。为NO则以application的设置为准,view controller的prefersStatusBarHidden方法无效,是根本不会被调用的。
根据以上描述分以下两种情形:
一.View controller-based status bar appearance设为YES。
这时 view controller中对status bar的设置优先级高于application的设置,用下面的方式隐藏status bar。
分两步实现:
第一步:在view controller中调用setNeedsStatusBarAppearanceUpdate,更新status bar的显示
第二步:覆盖view controller的prefersStatusBarHidden的实现,返会YES。
二.View controller-based status bar appearance设为NO
这时application的设置优先级最高,用下面的方式隐藏status bar:
结论
如果是iOS6,则还通过sharedApplication隐藏。
如果是iOS7,则用setNeedsStatusBarAppearanceUpdate加prefersStatusBarHidden的方式来隐藏 status bar。
取info.plist中 View controller-based status bar appearance中的设置
参考链接:http://www.cnblogs.com/machenglong/p/3795876.html
5. UITableView
tableView(_:numberOfRowsInSection:) 控制tableView中section中对应的行数(一个section有多少行)
tableView(_:cellForRowAtIndexPath:) 定制tableView单元格样式,及填充数据
tableView(_:commitEditingStyle:forRowAtIndexPath:) 设置tableView可编辑
控制tableView的section,默认为0
6. UITableView Delete Row
7. UITableViewRowAction (iOS8新特性)
覆盖tableView(_:editActionsForRowAtIndexPath:)方法
8. prepareForSegue
9. Customizing the Table View Appearance
在
tableView(_:cellForRowAtIndexPath:)
中添加如下代码(设置单元格透明,使tableView背景色可见):_在viewDidLoad_方法中设置*
_在viewDidLoad_方法中设置*
10. Customizing the Appearance of NavigationBar
iOS Font Name http://iosfonts.com/
完整的代码大致如下:
将以上代码添加到
application(_:didFinishLaunchingWithOptions:)
方法中viewDidLoad方法中添加如下代码
11. 收缩导航栏 (iOS8新特性)
在视图A中添加如下代码:
在视图B中添加如下代码:
viewDidLoad
方法在视图可见或移除时调用。当视图可见时会调用viewWillAppear
和viewDidAppear
方法。viewWillAppear
方法在视图将要显示时调用,viewDidAppear
在视图已经显示可见后调用。viewWillAppear
方法在每次视图可见的时候都会调用。12. Change the Style of Status Bar(修改状态栏样式)
选择项目,在项目属性的
info
选项中添加新的属性。key为View controller-based status bar appearance
value为NO
。这将影响整个项目在
AppDelegate
中的application(_:didFinishLaunchingWithOptions:)
方法中添加如下代码:参考链接:http://stackoverflow.com/questions/17678881/how-to-change-status-bar-text-color-in-ios-7
13. Self Sizing Cells (iOS8新特性)
在
viewDidLoad
中添加如下代码:注意:同时记得设置Cell中label的
lines
属性的值为0
,默认为1
14. 连线Storyboard退出
将Storyboard中视图控制器上的
Exit
图标与上面的代码关联就好。注意检测类型为unwind segue
15. 设置背景模糊
这里是通过给ViewController添加一个UIImageView控件,然后为UIImageView设置毛玻璃效果
在ViewController创建UIImageView的一个属性引用
在ViewController的
viewDidLoad
方法中添加如下代码16. Creating Round Buttons in Interface Builder
在Interface Builder中为UIButton设置圆角(选中UIButton,在属性面板的User Defined Runtime Attributes添加如下的配置)
Key Path为layer.cornerRadius
Type为Number
Value为30
17. 设置UIBarButtonItem的颜色及UIToolbar的背景色
在
AppDelegate
的application(_:willFinishLaunchingWithOptions:)
方法中添加如下代码:18. Basic Animations Using UIView
为UIView中添加动画,主要是设置控件的
transform
属性。首先在
viewDidLoad
中为目标控件设置动画初始值,代码如下:以上代码设置dialogView的transform为CGAffineTransformMakeScale(0.0, 0.0)
接着在viewDidAppear方法中设置该控件动画的结束值
以上代码表达的意思是设置dialogView等比放大一倍,整个动画持续(或耗时)0.7秒,不延时。
上述的动画效果用
Spring Animation
的代码如下(同样在viewDidAppear方法中):CGAffineTransformMakeTranslation(x, y)该类动画主要是通过修改控件x,y的坐标值,来达到动画效果
同样首先在
viewDidLoad
方法中为目标控件设置一个动画状态值(同样是控件的transform属性)接着在
viewDidAppear
方法中设置该控件动画的结束值以上代码的意思是,移动dialogView到(0,0)点,整个动画过程耗时0.7秒,不延迟。在
viewDidLoad
方法中为dialogView的transform
属性设置为CGAffineTransformMakeTranslation(0, 500),紧接着在viewDidAppear
方法中为dialogView的transform
属性设置为CGAffineTransformMakeTranslation(0, 0),由于viewDidLoad
方法在viewDidAppear
方法之前调用,一开始dialogView位于(0, 500),随后位移到(0, 0)坐标点,x轴不变,y轴由500缩小到0(垂直方向缩小),由此观察到dialogView是一个Slide Up的动画效果。顾名思义,就是为一个视图控件,同时绑定多个动画效果,主要通过使用
CGAffineTransformConcat(transform1, transform2)
来实现。首先在
viewDidLoad
方法中定义一个等比缩放动画的初始值及一个位移动画的初始值,代码如下:接着在
viewDidAppear
方法中同样定义一个等比缩放动画的结束值及一个位移动画的结束值上述代码表达的意思是:dialogView等比放大一倍,同时向上移动(y坐标从0改变到500),整个动画过程耗时0.7秒,不延时。通俗了讲就是:等比放大一倍,y坐标从 0 Slide Up 到 500。同理Slide Down为y坐标减小(比如:y坐标从0减小到-500)
在动画这里,需要了解视图的生命周期及与之对应的每一个方法:
ViewController的生命周期中各方法执行流程如下:
注:loadView和viewDidLoad的区别就是,loadView时view还没有生成,viewDidLoad时,view已经生成了,loadView只会被调用一次,而viewDidLoad可能会被调用多次(View可能会被多次加载),当view被添加到其他view中之前,会调用viewWillAppear,之后会调用viewDidAppear。当view从其他view中移除之前,调用viewWillDisAppear,移除之后会调用viewDidDisappear。当view不再使用时,受到内存警告时,ViewController会将view释放并将其指向为nil。
19. MapView
首先添加
MapKit framework
。选中项目的target
,在capabilities
选项卡下,开启Maps
为ON
即可。首先实现
MKMapViewDelegate
协议,接着重写mapView(_:viewForAnnotation:)
方法。记着在viewDidLoad
方法中为mapView
设置代理mapView.delegate = self;
20. Static Table View and UIImagePickerController
首先拖一个
UITableViewController
,然后在tableView
的属性栏中修改tableView
的Content
属性为Static Cells
。默认会创建三个静态空白的Cell。注:若指定imagePicker的sourceType为.Camera,则为照相模式。
获取用户选择的照片,需要实现
UIImagePickerControllerDelegate
协议,需要实现imagePickerController(_:didFinishPickingMediaWithInfo:)
方法。具体代码如下:注:记得在
viewDidLoad
方法中为UIImagePickerController设置imagePicker.delegate = self
注意:此处有一个bug,之前设置了状态栏的文字及背景色会失效,此处需要修复,需要实现
UINavigationControllerDelegate
协议,具体代码如下:注:记得为navigationController设置代理
21. Core Data
1. 首先创建
Data Model
。Core Data -> Data Model -> FoodPin.xcdatamodeld2.
Add Entity
(创建Entity
,Entity
与实体名称对应,比如说该示例中的Restaurant
)3.
Add attributes
(添加属性)注:以上二三步是创建Data Model,紧接着,第四部创建Data Object
4.
Create Data Object
注:在上面的
Data Object
定义中Binary Data
使用NSData
类型,Boolean
使用NSNumber
来定义。当使用NSNumber
来表达Boolean
类型时,非零的值表示为true
,零为false
5.
Working with Managed Objects
5.1.
Get the managed object context from AppDelegate
注:获取
managedObjectContext
5.2.
Create a managed object for the Restaurant entity
注:此处的
Restaurant
为Entity
值5.3.
Use the context to save the new object into database
具体代码如下:
注:
UIImagePNGRepresentation
,将Image转化为NSData5.4.
Fetching Data Using Core Data
viewWillAppear
方法中添加如下代码:)NSFetchedResultsController
(实现NSFetchedResultsControllerDelegate
协议)具体代码如下:
使用
NSFetchedResultsController
,若内容发生改变时,将自动调用NSFetchedResultsControllerDelegate
的以下几个方法:其对应的调用顺序以上文的顺序自上而下依次调用。
controllerWillChangeContent(_:)
controller(_:didChangeObject:atIndexPath:forChangeType:newIndexPath:)
controllerDidChangeContent(_:)
5.5.
Deleting Data Using Core Data
具体代码如下:
6.
Viewing the Raw SQL Statement
选择
Stop
按钮右边的项目名称,选择Edit Scheme
,选择Arguments
选项卡,在Argument Passed on Launch
选项下添加如下参数:点击OK后,再次运行即可在控制台看到真实的SQL输出。
22. Search Bar (
UISearchController
iOS 8新特性)在iOS 8中使用
UISearchController
替换UISearchDisplayController
。使用UISearchController的代码大致如下:
具体代码如下:
注:上述代码是为tableView添加searchBar(充当tableHeaderView)
注:以上代码是通过使用数组的filter方法来实现过滤
实现
UISearchResultsUpdating
协议。在
viewDidLoad
方法中添加以下代码:重写
updateSearchResultsForSearchController
方法,代码大致如下:23. UIPageViewController
UIPageViewController
提供vertical
和horizontal
两种样式,其过渡样式又分为Page Curl
和Scroll
两种,默认为Page Curl
首先在
Storyboard
中拖入一个PageViewController
。(并为其指定Storyboard ID
为PageViewController
),事实上PageViewController
为一个容器,用来控制和显示具体的PageView
。一般将这个视图称为PageContentViewController
,在该视图上设计要显示的内容。同样在在Storyboard
中拖入一个View Controller
设置其Storyboard ID为PageContentViewController
。拖入两个label和一个imageview填充PageContentViewController
,作为PageViewController
要控制显示的视图。PageContentViewController
class继承UIViewController
,并将UI与代码关联。其代码大致如下:PageViewController
class继承UIPageViewController
,并且实现UIPageViewControllerDataSource
协议。其代码大致如下:PageViewController
继承UIPageViewController
并且实现UIPageViewControllerDataSource
协议,该类主要控制及显示具体的PageContentView
(PageContentViewController
),通过UIPageViewControllerDataSource
协议中的两个方法来控制其显示。pageViewController(_:viewControllerBeforeViewController:)//上一个PageContentView
pageViewController(_:viewControllerAfterViewController:)//下一个PageContentView
注:类
PageViewController
创建和控制PageContentView
,storyboard?.instantiateViewControllerWithIdentifier("PageContentViewController") as? PageContentViewController
,使用storyboard
通过在storyboard
中为ViewController设置的Storyboard ID
获取ViewController(PageContentViewController)通过
storyboard?.instantiateViewControllerWithIdentifier("PageViewController") as? PageViewController
获取PageViewController
(PageView控制器),最终使用presentViewController
显示。通过在
PageViewController
中实现UIPageViewControllerDataSource
中的以下两个方法实现:presentationCountForPageViewController PageContentView总个数
presentationIndexForPageViewController 当前选中的PageContentView的索引
其代码大致如下:
注:
dismissViewControllerAnimated(true, completion: nil)
关闭或销毁当前ViewController
通过
UIPageControl
控件实现。(略)使用
NSUserDefaults.standardUserDefaults()
获取NSUserDefaults
对象。通过下面的方法检索值。
大致代码如下:
24. Tab Bar
select the Navigation Controller(Initial View Controller) -> select Editor > Embed in > Tab Bar Controller.
在使用Navigation Controller push后的ViewController中隐藏Tab Bar有以下两种方法:
第一种方法:
在
StoryBoard
中选择目标ViewController在Attribute Inspector
选项中勾选Hide Bottom Bar on Push
。第二种方法:
在
prepareForSegue
方法中设置destinationController
的hideBottomBarWhenPushed
属性为truetintColor 文字颜色
barTintColor 背景色
Tab Bar Item Image
修改TabBar选项卡的图片,选中该选项,在
Attribute Inspector
选项中修改system item
选项为Custom
然后设置Title
或Image
属性。Selection Indicator Image 设置选中后的图片
25. WebView and Email
使用
MFMailComposeViewController
发送邮件,实现MFMailComposeViewControllerDelegate
协议中的mailComposeController(_:didFinishWithResult:error:)
方法26. CloudKit
Targets -> Capabilities -> iCloud -> ON -> CloudKit
选择Targets,切换到Capabilities选项卡,在iCloud选项上选择ON,并且选择iCloud选项下方的Services属性为CloudKit
使用
CloudKit Dashboard
来管理和创建(具体与CoreData的用法类似)在左侧的面板区域,选择
Record Types
,点右边的+
创建一个Record Type
(如:Restaurant),接着定义attribute。CloudKit
支持String,Data/Time,Double,Location,Asset(存放图片)等类型。本书例子中的属性定义对应如下:
定义好属性后,可以使用面板上的
+
添加数据。大致代码如下所示:
具体代码片段:
替换getRecordsFromCloud方法:
显示UIActivityIndicatorView
UIActivityIndicatorView
有三种样式:Gray
,White (default)
和WhiteLarge
隐藏或关闭UIActivityIndicatorView
修改上文中的
getRecordsFromCloud
方法修改上文中的
tableView(_:cellForRowAtIndexPath:)
方法在
TableViewController
的viewDidLoad
方法中添加如下代码:使用下面的代码隐藏
refresh control
在
CloudKit dashboard
中,在meta index
,选择Fields
选项,为Date Created
meta data 选项勾选Sort
。在
getRecordsFromCloud
方法中添加如下代码:27. Localization(国际化)
通过使用
NSLocalizedString
宏来实现国际化,Xcode将国际化资源存储在Localizable.strings
文件中。select Editor > Export For Localization(最终导出为XLIFF文件,XLIFF是一种标准格式的xml文件)
28. APPENDIX
28.1. Swift Basics
Objective-C
Swift
28.2. Arrays
Objective-C:
Swift:
28.3. Dictionaries
Objective-C:
Swift:
28.4. Classes
Objective-C:
Swift:
28.5. Methods
方法调用:
Objective-C:
Swift:
28.6. Control Flow
输出结果:
输出结果:
注:
..
不包含后者,...
包含后者。28.7. Tuples
28.8. Optionals
28.9. Unwrapping Optionals
28.10. Optional Binding
28.11. Optional Chaining
The text was updated successfully, but these errors were encountered: