【swift3.0】【記錄自定義控制器或者視圖】【記錄】

貢獻做者 -【XJDomain】
博客XJ:  https://my.oschina.net/shengbingli/blog
GitHub直播地址https://github.com/lishengbing/XJDomainLiveios

 

1:自定義控制器,重寫控制器的init方法
>實現的必要方法:外部傳入參數,內部使用一個屬性接收這個參數保存起來便可
>注意: 控制器是調用: super.init(nibName: nil, bundle: nil)
git

// MARK: - 自定義函數
    init(kTargetRight : CGFloat) {
        super.init(nibName: nil, bundle: nil)
        self.targetRight = kTargetRight
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

 

2:若是一個視圖上有不少手勢,要想靜止這些手勢和點擊之類的,只須要靜止這個視圖的交互便可github

(self.parent as! CHHomeIndexViewController).mainView.isUserInteractionEnabled = false

 

3:自定義視圖,重寫init方法
>實現的必要方法:也是在內部裏面定義一個屬性保存這個外部傳來的參數
>注意:自定義View是調用: super.init(frame: frame)
swift

// MARK: - 自定義構造函數
    init(frame: CGRect, titles: [String]) {
        self.titles = titles;
        super.init(frame: frame)
        // 設置UI界面
        setupUI()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

 

4:在一個View上添加一個collectionView的話狀況!!!
!!! 註冊和修改內邊距是在awakeFromNib()方法中實現中
!!! 修改collectionView的itemSize的話須要在layoutSubViews方法中實現api

// 系統回調函數
    override func awakeFromNib() {
        super.awakeFromNib()
        
        // 讓控件不隨着父控件的拉伸而拉伸
        autoresizingMask = UIViewAutoresizing()
        
        // 註冊cell
        collectionView.register(UINib(nibName: "XJGameCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: kGameCellID)
        
        // 給collectionView添加內邊距
        collectionView.contentInset = UIEdgeInsetsMake(0, kEdgeInsetMargin, 0, kEdgeInsetMargin)
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
        layout.itemSize = CGSize(width: 80, height: collectionView.bounds.size.height)
        layout.minimumLineSpacing = 0
        layout.minimumInteritemSpacing = 0
        layout.scrollDirection = .horizontal
        collectionView.showsHorizontalScrollIndicator = false
    }

 

5:一個View從Xib中加載視圖的話狀況!!!
通常須要快速建立一個類方法加載,以下:緩存

// MARK: - 快速建立的類方法
extension XJRecommendGameView {
    class func recommendGameView() -> XJRecommendGameView {
        return Bundle.main.loadNibNamed("XJRecommendGameView", owner: nil, options: nil)?.first as! XJRecommendGameView
    }
}

 

6:ios10之後保存圖片到本地默認相冊的方法:閉包

@objc fileprivate func saveClick() {
        // 1:獲取當前顯示的圖片
       let cell = collectionView.visibleCells.first as! XJPhotoBrowerCollectionViewCell
       guard let image = cell.imageView.image else { return }
        
        // 2:將image對象保存相冊使用這個方法
        /*
         - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
        */
        
        // 這個方法不行,用上面的方法
        UIImageWriteToSavedPhotosAlbum(image, self, #selector(image(image:didFinishSavingWithError:contextInfo:)), nil)
    }
    
    
    @objc fileprivate func image(image : UIImage, didFinishSavingWithError error : Error?, contextInfo : Any) {
        var showInfo = ""
        if error != nil {
            showInfo = "保存失敗"
        }else {
            showInfo = "保存成功"
        }
        SVProgressHUD.setMinimumDismissTimeInterval(0.5)
        SVProgressHUD.showSuccess(withStatus: showInfo)
    }

7:獲取當前顯示的cell方法:app

// 獲取當前顯示的cell
        print("111")
        let cell = collectionView.visibleCells.first as! XJPhotoBrowerCollectionViewCell

// 獲取當前顯示的cell
        let cell = collectionView.visibleCells.first as! XJPhotoBrowerCollectionViewCell
        
        // 返回當前cell的下標值
        return collectionView.indexPath(for: cell)!

 

8:若是在一個控制器中純代碼建立collectionView的狀況!!!
> 通常狀況下是在setupUI中設置itemSize約束
> 另一種方式:本身自定義佈局便可
ide

// 懶加載控件
    fileprivate lazy var collectionView : UICollectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: XJPhotoBrowerCollectionViewLayout())

 

// MARK: - 自定義佈局
class XJPhotoBrowerCollectionViewLayout : UICollectionViewFlowLayout {
    override func prepare() {
        super.prepare()
        itemSize = collectionView!.frame.size
        
        // 設置itemSize屬性
        minimumInteritemSpacing = 0
        minimumLineSpacing = 0
        scrollDirection = .horizontal
        
        // 設置collectionView屬性
        collectionView?.isPagingEnabled = true
        collectionView?.showsHorizontalScrollIndicator = false
        collectionView?.showsVerticalScrollIndicator = false
        collectionView?.bounces = false
    }
}

 

9:設置滾動視圖須要在一半的狀況切換狀況!!!函數

func scrollViewDidScroll(_ scrollView: UIScrollView) {
        // 1.1咱們能夠設置當滾動到一半的時候就會顯示下一個下標便可
        let offsetX = scrollView.contentOffset.x + scrollView.bounds.width * 0.5
        
        // 2.設置label
        let index = Int(offsetX / scrollView.bounds.size.width)
        label.text = "\(index + 1) / \(images.count)"
    }

 

10:自定義進度條View,繪畫扇形至完整,根據進度!!!

import UIKit

class XJProgressView: UIView {
    
    var progress : CGFloat = 0 {
        didSet {
            setNeedsDisplay()
        }
    }
    
    override func draw(_ rect: CGRect) {
        super.draw(rect)
        // 獲取參數
        let center = CGPoint(x: rect.width * 0.5, y: rect.height * 0.5)
        let radius = rect.width * 0.5 - 3
        let startangle = CGFloat(-M_PI_2)
        let endAngle = CGFloat(M_PI * 2) * progress + startangle
        
        // 建立貝塞爾曲線
        let  path = UIBezierPath(arcCenter: center, radius: radius, startAngle: startangle, endAngle: endAngle, clockwise: true)
        
        // 繪製一條中心點的線
        path.addLine(to: center)
        path.close()
        
        // 設置繪製的顏色
        UIColor.white.withAlphaComponent(0.4).setFill()
        
        // 開始繪製 path.stroke() 這是繪製空心
        path.fill()
    }
}

 

11:若是重寫構造函數的話,若是也須要使用init()方法的話,就須要從新init()方法,否則外面不能調用使用

見:XJWeiBo -> XJPopoverAnimator類說明

// 設置閉包
    var callBack : ((_ isPresented : Bool) -> ())? = nil
    
    
    // 自定義構造函數
    // 注意:若是不重寫默認的init()方法的話,外面建立對象的時候是沒有objc()這個方法的,由於自定義構造函數覆蓋了默認的init()方法,除非重寫默認的 init()方法便可
    override init() {
        super.init()
    }
    
    init(callBack : @escaping (_ isPresented : Bool) -> ()) {
       self.callBack = callBack
    }

 

12:使用Kingfisher緩存保存圖片

// 緩存圖片<爲了先下載完成再刷新表格:能夠加入到線程組中,等線程組結束,而後線程完成通知再次刷新便可>
    fileprivate func cacheImage(statusA : [XJStatusModel], _ finishedCallBack : @escaping () -> ()) {
        // 1.建立組
        let group = DispatchGroup()
        
        // 緩存圖片
        for statusModel in statusA {
            for picUrl in statusModel.picUrlArray {
                // 進入組
                group.enter()
                let down = KingfisherManager.shared.downloader
                down.downloadImage(with: picUrl, options: [], progressBlock: nil, completionHandler: { (_, _, _, _) in
                    // 離開組
                    group.leave()
                })
            }
        }
        
        
        // 返回數據
        group.notify(queue: DispatchQueue.main) {
            finishedCallBack()
        }
    }

 

13:從Kingfisher緩存中提取照片

// 1.從緩存中取出下載圖片
            let cacheImg = KingfisherManager.shared.cache
            let urlString = status?.picUrlArray.first?.absoluteString
            guard let image = cacheImg.retrieveImageInDiskCache(forKey: urlString!) else { return CGSize.zero}

 

14: 獲取cell上的相對Window的座標<轉移座標系>

// 1:獲取cell
        let cell = cellForItem(at: indexPath)!
        
        // 2:獲取cell的frame 轉移座標系 convert(<#T##point: CGPoint##CGPoint#>, to: <#T##UICoordinateSpace#>)
        let starFrame = self.convert(cell.frame, to: UIApplication.shared.keyWindow)

 

 15:字典中的字典轉模型處理

// MARK: - 自定義構造函數
    init(dict : [String : Any]) {
        super.init()
        setValuesForKeys(dict)

        // 1.將用戶字典中中user對象轉成我的模型:二級字典轉模型
        if let userDict = dict["user"] as? [String : Any] {
            user = XJUserModel(dict: userDict)
        }
        
        // 2.將轉發微博專爲模型
        if let retweetedDict = dict["retweeted_status"] as? [String : Any] {
            retweeted_status = XJStatusModel(dict: retweetedDict)
        }

    }

 

16:字符串的截取處理

// 2.對的字符串進行處理
            // <a href=\"http://app.weibo.com/t/feed/5yiHuw\" rel=\"nofollow\">iPhone 6 Plus</a>
            let statrIndex = (source as NSString).range(of: ">").location + 1
            let length = (source as NSString).range(of: "</").location - statrIndex
            sourceText = (source as NSString).substring(with: NSRange(location: statrIndex, length: length))

 

17:後期不斷更新......

相關文章
相關標籤/搜索