美文网首页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