美文网首页iOS开发·持续学习·分享新知
iOS开发-每周五复盘·分享-20180713

iOS开发-每周五复盘·分享-20180713

作者: 07e819eca0df | 来源:发表于2018-07-16 21:44 被阅读5次

今天给大家分享下面几点内容。

【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·简书号」
© 著作权归作者所有

相关文章

网友评论

    本文标题:iOS开发-每周五复盘·分享-20180713

    本文链接:https://www.haomeiwen.com/subject/lvripftx.html