Try to learn and practice developing iOS app with Swift.
部分项目截图、涉及内容的介绍:《Intro to Projects》。例如:
###ios tutorial
videos better watch again:
###websites to check
- blackmoondev
- Get clear idea of MVC: Model View Controller (MVC)
- Extensions are fun: Extensions
- How does clipsToBounds work?: StackOverflow: How does clipsToBounds work?
###informative links
- enable-disable-auto-layout-constraints
- dynamic-height-issue-for-uitableview-cells-swift/36185105#36185105
- iOS Fundamentals: Frames, Bounds, and CGGeometry
- about UILabel
Articles written by myself during my journey to iOS development.
- UISearchBar(一)修改背景层和输入框层的背景颜色和边框颜色
- AutoLayout:UITableViewCell 自适应高度的一个例子
- AutoLayout:constraint priority 约束优先级(九宫格续,一个更优方案)
- 【译】iOS 基础:Frames、Bounds 和 CGGeometry
- 仿微博 iOS 客户端 TabBar 中间按钮
- 自定义 UITabBar 总结(一个模拟 instagram TabBar 的例子)
- 实现 instagram 底部弹出菜单的一个例子(模拟 instagram 系列)
- Swift 实现多个 TableView 的侧滑与切换(模拟 instagram 系列)
- AutoLayout 中需要注意的点
- 模拟凤凰新闻 | 更复杂的标签动画 - Swift 实现多个 TableView 的侧滑与切换
- 【译】UICollectionView 轻松重排
- UICollectionView 总结
If the layout isn't what you expect, check if you've added the constraints!!!
Use 'Equal Widths' to set the width of any StackView inside ScrollView, otherwise the width will go wrong.
###1.change present view
1 set storyboard_id
2 for example:
let tv = self.storyboard?.instantiateViewControllerWithIdentifier("TapViewController") as! TapViewController
self.presentViewController(tv, animated: true, completion: nil)
###2.differences between the content modes
###3.how to load and play a audio
How to play sounds using AVAudioPlayer
drag the audio file to the app directory and just press enter
import UIKit
import AVFoundation
class ViewController: UIViewController{
var btnSound: AVAudioPlayer!
override func viewDidLoad() {
super.viewDidLoad()
let path = NSBundle.mainBundle().pathForResource("btn", ofType: "wav")
let soundUrl = NSURL(fileURLWithPath: path!)
do {
try btnSound = AVAudioPlayer(contentsOfURL: soundUrl)
btnSound.prepareToPlay()
} catch {
}
}
...
###4.animationImages
@IBOutlet weak var monsterImg: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
var imgArray = [UIImage]()
//init your image array, for example
for var x = 1; x <= 4; x++ {
let img = UIImage(named: "idle\(x).png")
imgArray.append(img!)
}
monsterImg.animationImages = imgArray
monsterImg.animationDuration = 0.8
monsterImg.animationRepeatCount = 0
monsterImg.startAnimating()
//animationImages
//An array of UIImage objects to use for an animation.
//animationDuration
//The amount of time it takes to go through one cycle of the images.
//The time duration is measured in seconds. The default value of this property is equal to the number of images multiplied by 1/30th of a second. Thus, if you had 30 images, the value would be 1 second.
//animationRepeatCount
//Specifies the number of times to repeat the animation.
//The default value is 0, which specifies to repeat the animation indefinitely.
}
###5.a dragable image class
import Foundation
import UIKit
class DragImg: UIImageView {
var originalPosition: CGPoint!
//why override this?
override init(frame: CGRect) {
super.init(frame: frame)
}
//what's this?
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
originalPosition = self.center
}
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
if let touch = touches.first {
let position = touch.locationInView(self.superview)
self.center = CGPointMake(position.x, position.y)
}
}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
self.center = originalPosition
}
}
###6.NSTimer
var timer: NSTimer!
timer = NSTimer.scheduledTimerWithTimeInterval(TIME_INCREMENT, target:self, selector: "FUNCTION", userInfo: nil, repeats: BOOL)
###7.NSNotificationCenter
//somewhere
NSNotificationCenter.defaultCenter().postNotification(NSNotification(name: "NOTIFICATION_NAME", object: nil))
//somewhere else
NSNotificationCenter.defaultCenter().addObserver(self, selector: "FUNCTION", name: "NOTIFICATION_NAME", object: nil)
###8.must add these init when create a subclass of UIImageView
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
An article about 'init': Swift init patterns
###9.Segue pass message to the next segue
//somewhere
performSegueWithIdentifier("IDENTIFIER", sender: A_SENDER)
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyOBject?) {
if segue.identifier == "IDENTIFIER" {
if let whatVC = segue.destinationViewController as ? SomeViewController {
if let theString = sender as? String {
whatVC.someStr = theString
}
}
}
}
###10.Extensions
extension Double {
var currency: String {
return "$\(self)"
}
}
###11.To load page with http protocol edit the info.plist
NSAppTransportSecurity Dictionary
NSAllowsArbitraryLoads Boolean YES
###11.hide keyboard
Add the following to your viewDidLoad():
let tap = UITapGestureRecognizer(target: self, action: "dismissKeyboard")
tap.cancelsTouchesInView = false
view.addGestureRecognizer(tap)
and then add the following method declaration:
func dismissKeyboard()
{
view.endEditing(true)
}
###12.UITableViewCell automatic resizing
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return UITableViewAutomaticDimension
}
参考:Automatically resizing UITableViewCells with Dynamic Type and NSAttributedString
###13.change view size
view.frame.CGRectMake(0 , 0, self.view.frame.width, self.view.frame.height * 0.7)
###14.set UICollectionViewCell spacing & line spacing
let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
layout.minimumInteritemSpacing = 1
layout.minimumLineSpacing = 1
collectionView.collectionViewLayout = layout
1 Trapper should actually be Tapper. It's a typing mistake.