貢獻做者 -【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:後期不斷更新......