iOS 开发问与答(FAQ)
1.集成SQLite.swift框架出错:“sqlite3.h not found”
由于Xcode编译SDK时,模块映射只能使用绝对路径而不能使用相对路径,所以Xcode.app的路径在module.modulemap中被写死了。在module.modulemap文件中,将Xcode.app安装路径改变成你的Xcode安装路径,比如:
/Applications/Xcode6.4.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/sqlite3.h
注意,这里使用的是Xcode6.4.app文件名,而不是默认的Xcode.app文件名。
Clean,重新编译。
2.如何新建一个故事板,并改变故事板中的创建的ViewController的默认大小为iPhone/iPad?
新建storyboard文件,打开File面板,去掉“Use Size Classes”选项,Xcode会问你是否保留iPhone/iPad的Size类,选择一个类别(iPhone或iPad),然后点击”Disable Size Classes”按钮。这样,故事板中的view的大小将使用选定设备的屏幕大小。
3.如何修改Statusbar的背景色
首先确保Info.plist中View controller-based status bar appearance一项为NO。
在viewcontroller中新加代码:
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return UIStatusBarStyle.LightContent
}
实现如下方法并在viewDidLoad方法中调用它:
func addStatusBarBgColor(color:UIColor){
let view=UIView(frame: CGRectMake(0, 0,UIScreen.mainScreen().bounds.size.width, 20))
view.backgroundColor=color
self.view.insertSubview(view, atIndex: 0)
}
4.如何修改Toolbar的背景色
首先确保Toolbar的Trancent一项未勾上。
然后实现如下方法并在viewDidLoad方法中调用它:
func addToolbarBgColor(color:UIColor,toolbar:UIToolbar){
let view=UIView(frame: toolbar.bounds)
view.backgroundColor=color
toolbar.insertSubview(view, atIndex: 0)
}
5.如何将Dictionary转换成SwiftyJSON中的JSON对象?
func dic2json(d:Dictionary<String,AnyObject>)->JSON?{
var error:NSError?;
if let data = NSJSONSerialization.dataWithJSONObject(d, options: NSJSONWritingOptions.PrettyPrinted, error: &error) {
return JSON(data: data, options: NSJSONReadingOptions.MutableContainers, error: nil)
}
println("Object convert JSON error:\(error)")
return nil
}
6.在故事板中,无法为UIButton创建IBAction连接
原因在于某个对UIButton的扩展中将IButton定义为
extension UIButton : DynamicTypeChangeHandler {
将其注释即可。
7.如何去除Toolbar上方的细线?
toobar.clipsToBounds = YES
细线即被清除
8.当使用setTitle:forState:方法改变按钮标题时,会有一个FadeInOut动画效果,导致文字闪烁?
将按钮设置为 UIButtonTypeCustom,可以消除闪烁。
9.移除字符串最后一个字符
if str.hasSuffix(",") {
str.removeAtIndex(str.endIndex.predecessor())
}
10.有时候 NSLocalizedStringFromTable 不生效
假设你有一个 .strings 进行了本地化,但你发现 NSLocalizedStringFromTable 方法根本取不到任何本地字符串(甚至 en 字符串也取不到,只返回 key 值)。那么你可以 Clean 一下再编译。
如果在模拟器上测试,可以编辑 Scheme ,将 Run /option 下的 applicaton language和 application region 两项修改为中文/中国进行测试。
11.如何让 Xcode 加载 JPG 文件?
从 Xcode 6.1 开始,JPG 图像可以放进 asset catalog(资源目录) 中了。但是当你这样做的时候,图片却只会显示为空白,同时控制台报一个错误:
Could not load the “abc.png” image referenced from a nib in the bundle with identifier “xxx”。
将包含JPG文件的 Image Set 的 Render As 属性(在属性面板中)修改为 Original Image 即可。
注:编译过后,你又可以将 Render As 属性修改为 Default。但是当你 Clean 以后又不行了(必须重新改为 Original Image)。
12.怎样在一个 NSLayoutConstraint 上执行动画?
因为布局约束修改之后并不会导致立即重新计算自动布局。所以在动画块中修改NSLayoutConstraint不会导致UIView显示动画。
所以,当你修改完约束的constant之后,应该使用layoutIfNeeded()方法强制让布局引擎重新计算view的布局:
UIView.animateWithDuration(0.5, delay: 0, options: UIViewAnimationOptions.CurveEaseOut, animations: { () -> Void in
[self]
self.locationTop.constant = self.locationIsShow ? -42 : -2
self.view.layoutIfNeeded()
}, completion: { (stop) -> Void in
self.locationIsShow = !self.locationIsShow
})
13.如何让工具栏的左按钮放在正确的位置?
默认工具栏(或导航栏)左按钮的位置会距离工具栏left约12px左右的位置。如果你想让左按钮从工具栏的 0,0位置开始,可以在左按钮前端插入一个 Fixed Space Bar Button Item,并将它的 width 设置为 0(如果要更靠左一些,可以将width设置为负值)
14.为什么多行文本框中的文本会从文本框下移一段位置开始?
如下图所示:
因为导航栏的原因,光标和文本默认会下移64个像素。解决办法,在viewDidLoad 方法中,加入代码:
if self.respondsToSelector("edgesForExtendedLayout"){// iOS 7+
self.edgesForExtendedLayout=UIRectEdge.None
}
15.为什么 Scroll Direction 设置为 Horizontal 后 UICollectionViewCell 仍然会纵向排列(换行)?
如下图所示:
这是因为 Cell 的高度不足以占据屏幕的高度。在故事板中,将 UICollectionView 的 Cell Size 设置为一个比较高的高度,比如:225x400。效果如下: