今天给大家分享下面几点内容。
【1】TabBarController 如何使用自定义的 item icons 。
【2】老工程导入 SnapKit 后会报错的问题·解决方案。
【3】TabBarController 如何优雅的修改默认选择页面。
【4】snpkit 用法·细节点。
【5】如何优雅地,约束布局,button 里的 image。
【6】圆形用户头像的两种生成方式。
【7】如果优雅地解决添加了点击事件后,却始终无效(点击无反应。反馈)问题。
【8】一句话概括·Swift 数组的值拷贝与引用传递的区别。
【9】如何优雅地制作·圆角阴影·(让圆角和阴影同时出现)。
下面我们来一个一个说。
【1】TabBarController 如何使用自定义的 item icons 。
——————
「用过 TabBarController 的同学,都知道,TabBarController 的 TabBar 自带一套针对 TabBarItem 的UI样式,即使我们把设计设计好的icon切图放进去(item里),它也依旧显示其默认的UI样式——文字和icon都是纯深蓝色。
那么,如果我们想要使用自定义的 item icons,想让它显示的样式是我们设计好的icon的样式,该怎么办呢?」
——————
可以这么办:(直接上代码吧,如下)
fileprivate func setTabBarItem() {
let item1 = XXXXXXViewController()
let item2 = YYYYYYViewController()
let item3 = ZZZZYYViewController()
let itemsArray = [item1,item2,item3]
let itemsImgArray = ImageConstant.itemsImgArray
let itemsImgSelectArray = ImageConstant.itemsImgSelectArray
let itemsTitleArray = StringConstant.tab_bar_itemsTitleArray
let itemsArrayCount = itemsArray.count
let itemsImgArrayCount = itemsImgArray.count
let itemsImgSelectArrayCount = itemsImgSelectArray.count
let itemsTitleArrayCount = itemsTitleArray.count
for i in 0 ..< itemsImgArrayCount {
if i < itemsArrayCount {
var image = UIImage(named: itemsImgArray[i])
image = image?.withRenderingMode(UIImageRenderingMode.alwaysOriginal)
itemsArray[i].tabBarItem.image = image
if i < itemsImgSelectArrayCount {
var selectedImage = UIImage(named: itemsImgSelectArray[i])
selectedImage = selectedImage?.withRenderingMode(UIImageRenderingMode.alwaysOriginal)
itemsArray[i].tabBarItem.selectedImage = selectedImage
}
if i < itemsTitleArrayCount {
itemsArray[i].tabBarItem.title = itemsTitleArray[i]
itemsArray[i].tabBarItem.setTitleTextAttributes(
[NSAttributedStringKey.font: FontUtility.getFontAfterSuittingSystem(FontConstant.PF_Light, size: CGFloat(12)),
NSAttributedStringKey.foregroundColor: UIColor.black],
for: .selected)
}
}
}
self.viewControllers = itemsArray
ShadowUtility.setViewShadow(self.tabBar)
}
【2】老工程导入SnapKit后会报错的问题·解决方案。
——————
「当我们需要维护一个老的Swift工程时,可能会遇到 SnapKit 升级后,工程报错无法运行的问题,怎么解决呢?」
——————
原因分析:
之所以维护一个老的 Swift 工程时可能会遇到 SnapKit 报错,而新建一个新的 Swift 工程则一般不会出现报错。
主要是因为 Swift 版本升级后,SnapKit 版本跟着升级适配,导致新老工程会出现不兼容现象。
简单的说,就是:
'SnapKit', '~> 3.0.0’,适配 Swift 3 (包含3及以下) —> 与Swift 4 不兼容。
'SnapKit', '~> 4.0.0’,适配 Swift 4 (包含4及以上) —> 与Swift 3 不兼容。
而我们的老过程,一般来说,使用的都是Swift 3 或 3以下的 Swfit版本。
所以,如果老工程的 podfile 里没有指定 SnapKit 的版本号,(如:只写「pod 'SnapKit’」,没有写「pod 'SnapKit', '~> 3.0.0’」,那么在我们当下维护它时,执行了 pod install / pod updata 操作后,该老工程里的 SnapKit 依赖版本,会自动更新为当下最新的版本4.0.0。
而老工程里的 Swift 版本设定还依旧是:Swift 3 或 3以下的 Swfit版本。
那么不兼容与冲突就出现了。
即:
'SnapKit', '~> 4.0.0’ 与Swift 3 不兼容。
有两种解决方案:
一、修改工程里的 Swift 编译版本。(推荐)
Project
-> Build Settings
-> Swift Complier - Language
-> Swift Language Version — 选中,改为4.0 (或4.0以上)
一、修改 podfile 里的 SnapKit 版本号
pod 'SnapKit', '~> 3.0.0’
或
pod 'SnapKit'
改为
pod 'SnapKit', '~> 4.0.0'
【3】TabBarController 如何优雅的修改默认选择页面。
——————
「很简单,只要一行即可」
——————
class XXXXXXTabBarViewController: UITabBarController {
fileprivate func resetDefaultTab() {
self.selectedIndex = Y
}
}
//把 Y 设为你想要它启动后默认选择的 item下标 即可(从0开始)
【4】snpkit用法·细节点。
——————
「二次约束·细节点」
——————
1>
如果要二次约束,记得用remakeConstraints ,否则意味着约束重复叠加,会达不到效果。(第一次约束也可以使用remakeConstraints,应该是snpkit内部会自动识别之前没有被约束过,则remakeConstraints相当于makeConstraints)
2>
在 TableViewCell 里使用 snpKit 来做约束的话,要记得:
「不可基于 contentView 来做约束,如:
make.centerY.equalTo(contentView.snp.centerY)」
「必须直接基于 self 来做约束,如:
make.centerY.equalTo(self.snp.centerY)」
【5】如何优雅地,约束布局,button 里的 image。
——————
「当 button 里的 icon 比较小( 为了显示效果,就是要显示这么小的 icon ),甚至远小于点击区域大小可设的最低阈值(超过的话,用户会很难点中该button,体验会很不好」
——————
那么如何在不改变点击识别区域大小的情况下,优雅地约束布局 button 里的 image 呢?
直接上代码,如下:
XXXXXXBtn = UIButton(type: .custom)
XXXXXXBtn.frame = CGRect(x: 0, y: 0, width: btnwid, height: btnwid)
mLikeBtn.setImage(UIImage(named: ImageConstant.XXXXXX), for: .normal)
mLikeBtn.imageEdgeInsets = UIEdgeInsets(top: (btnwid - btnImgHei)/2, left: (btnwid - btnImgWid)/2, bottom: (btnwid - btnImgHei)/2, right: (btnwid - btnImgWid)/2)
self.addSubview(XXXXXXBtn)
【6】圆形用户头像的两种生成方式。。
——————
「用户头像常常需要被设置为圆形,那么圆形头像要怎么来生成呢?」
——————
有两种方式:
一、设计师切好圆角的、背景透明的图,直接可用。
二、代码如下:
avatarImgV.layer.cornerRadius = X //X为你需要的圆形头像的半径
avatarImgV.layer.masksToBounds = true
【7】如果优雅地解决添加了点击事件后,却始终无效(点击无反应。反馈)问题。
——————
「如果你添加使用过:手势/按钮点击事件,那么很有可能在某些时候,你会遇到这种情况:
加了点击事件后,却始终无效(点击无反应。反馈),
即使是加了titleLabel.isUserInteractionEnabled = true后,也依旧无效,
怎么办呢?」
——————
原因分析:
通常出现这种情况,很可能是一个原因:
该 sender view 被添加到了 superView 的外面。
而之所以,你还能看到它,是因为 UIView 的 Layer 的 masksToBounds 默认值 为 false,你可以试试,把你「点击事件后,却始终无效」的 view 的 superView 的 Layer 的 masksToBounds 设为 true,然后你就会惊奇的发现,这个 view 不见了。
(因为它真的被添加到了superView的外面。。。)
既然,该 view/btn 已经位于 superView 的 frame 外面去了的话,那么自然是无法接收到点击事件的。
【8】一句话概括·Swift数组的值拷贝与引用传递的区别。
——————
「
Swift数组的值拷贝与引用传递的区别,
一句话概括就是:
只有在数组长度发生变化时,才会发生 值拷贝,否则都是 引用传递
」
——————
字典 a=b 值拷贝,数组 a=b 引用拷贝。
数组只有在改变长度时,才会发生值拷贝,
如:append 或 a = b + c(数组a b c)
【10】如何优雅地制作·「圆角阴影」·(让圆角和阴影同时出现)。
——————
「可能很多同学都遇到过,需要在同一个控件上,同时添加圆角和阴影的时候,会出现要么有阴影没圆角,要么就是有圆角没阴影,就是不能圆角和阴影同时出现,怎么办呢?」
——————
原因分析:
因为圆角和阴影的属性设置是互斥的:
圆角需要:
layer.masksToBounds = true
阴影需要:
view.clipsToBounds = false
二者互斥,自然不管怎么设置,都只能出现二者之一,不能二者同时出现了。
下面上代码:
class FloatingActionButton: UIView {
fileprivate func initView() {
let imgV = UIImageView(frame: CGRect(x: 0, y: 0, width: mWid, height: mHei))
imgV.backgroundColor = .blue
self.addSubview(imgV)
mImgV = imgV
}
fileprivate func layout() {
let imgCornerRadius = mWid / 2
let layer: CALayer = mImgV.layer
layer.masksToBounds = true
layer.cornerRadius = imgCornerRadius
let btnShadowV = UIView(frame: CGRect(x: 0, y: 0, width: mBtnImgWid, height: mBtnImgWid))
ShadowUtility.setViewShadow(btnShadowV, offset: CGSize(width: 0, height: 6), shadowColor: UIColor.init(white: 0, alpha: 0.26), shadowRadius: 8, shadowOpacity: 1)
btnShadowV.layer.cornerRadius = imgCornerRadius
btnShadowV.addSubview(mImgV)
self.addSubview(btnShadowV)
}
}
class ShadowUtility {
static func setViewShadow(_ targerView: UIView,
offset: CGSize = CGSize(width: 0, height: 0),
shadowColor: UIColor = UIColor.init(red: 0, green: 0, blue: 0, alpha: 0.2),
shadowRadius: CGFloat = 2,
shadowOpacity: Float = 1) {
let view = targerView
view.clipsToBounds = false
view.layer.shadowColor = shadowColor.cgColor
view.layer.shadowOffset = offset
view.layer.shadowRadius = shadowRadius
view.layer.shadowOpacity = shadowOpacity
}
}
<br>
——————
~ ^_^ ~
—— zeroOS 复盘于 2018/07/15
「zeroOS·简书号」
© 著作权归作者所有
网友评论