在好书app中有很多常用的第三方库,自己总结一下在以后的项目中也可以应用
shareSDK主要是一个分享功能,可以分享到微信,qq等,主要是要去看他的官网,注册app即可
HZPhotoBrower主要是图片放大的时候用到的 在点击图片的时候可以放大图片,可以选择放大图片时只有一张,或者轮播,有好几张 随后设置当前是在第几张
还要设置代理,和代理实现的方法
//实现图片点击时的放大 func photoBrowser(sender:UITapGestureRecognizer){ let photoBrowser = HZPhotoBrowser() //放大图片的个数 photoBrowser.imageCount = 1 //当前浏览的是第几张图 photoBrowser.currentImageIndex = 0 //代理 photoBrowser.delegate = self photoBrowser.show() } //实现photoBroswer的回调 func photoBrowser(browser: HZPhotoBrowser!, highQualityImageURLForIndex index: Int) -> NSURL! { //最终放大的图片 let coverFile = self.bookObject!["cover"] as? AVFile return NSURL(string: coverFile!.url) } func photoBrowser(browser: HZPhotoBrowser!, placeholderImageForIndex index: Int) -> UIImage! { //缓冲图 在加载过程当中 return self.bookTitleView?.cover?.image }
import UIKit class pushBookTableViewCell:SWTableViewCell{ //自定义cell var BookName:UILabel? var Editor:UILabel? var more:UILabel? //当前展开的是哪一个cell var swipCellindexPath:NSIndexPath? //封面 var cover:UIImageView? override func awakeFromNib() { super.awakeFromNib() // Initialization code } //初始化的方法 override init(style: UITableViewCellStyle, reuseIdentifier: String?) { super.init(style: style, reuseIdentifier: reuseIdentifier) //移除所有的cell for view in self.contentView.subviews{ view.removeFromSuperview() self.BookName = UILabel(frame: CGRectMake(70,8,242,25)) self.Editor = UILabel(frame: CGRectMake(78,33,242,25)) self.more = UILabel(frame: CGRectMake(78,66,242,25)) self.BookName?.font = UIFont(name: MY_FONT, size: 15) self.Editor?.font = UIFont(name: MY_FONT, size: 15) self.more?.font = UIFont(name: MY_FONT, size: 15) self.contentView.addSubview(BookName!) self.contentView.addSubview(Editor!) self.contentView.addSubview(more!) self.cover = UIImageView(frame: CGRectMake(8, 9, 56, 70)) self.contentView.addSubview(cover!) } } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func setSelected(selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } }
//记录上次左滑的按钮 var swipeCellIndexPath:NSIndexPath?继承他的协议
SWTableViewCellDelegate
//删除和编辑的按钮只能在一个cell钟出现 func swipeableTableViewCell(cell: SWTableViewCell!, scrollingToState state: SWCellState) { let indexPath = self.tableView?.indexPathForCell(cell) //当前有展开的按钮 if state == .CellStateRight{ if self.swipeCellIndexPath != nil && self.swipeCellIndexPath?.row != indexPath?.row{ //遮盖住 let swipeCell = self.tableView?.cellForRowAtIndexPath(self.swipeCellIndexPath!) as! pushBookTableViewCell swipeCell.hideUtilityButtonsAnimated(true) } //将当前的左滑的cell记录下来 self.swipeCellIndexPath = indexPath //没有左滑的cell }else if state == .CellStateCenter{ self.swipeCellIndexPath = nil } } //当点击右滑的两个按钮的时候 func swipeableTableViewCell(cell: SWTableViewCell!, didTriggerRightUtilityButtonWithIndex index: Int) { //将点击的cell隐藏起来 cell.hideUtilityButtonsAnimated(true) let indexPath = self.tableView?.indexPathForCell(cell) //是编辑的这个按钮 let object = self.dataArray[(indexPath?.row)!] as? AVObject if index == 0{ let vc = pushNewBookController() vc.fixType = "fix" GeneralFactory.addTitleWithTile(vc, title1: "关闭", title2: "发布") vc.bookObject = object self.presentViewController(vc, animated: true, completion: nil) }else { //删除的操作 ProgressHUD.show("") //删除讨论区和点赞区的所有有关这本书的信息 let discussQuery = AVQuery(className: "discuss") discussQuery.whereKey("BookObject", equalTo: object) discussQuery.findObjectsInBackgroundWithBlock({ (results, error) -> Void in for Book in results { let BookObject = Book as? AVObject BookObject?.deleteInBackground() } }) let loveQuery = AVQuery(className: "Love") loveQuery.whereKey("BookObject", equalTo: object) loveQuery.findObjectsInBackgroundWithBlock({ (results, error) -> Void in for Book in results { let BookObject = Book as? AVObject BookObject?.deleteInBackground() } }) object?.deleteInBackgroundWithBlock({ (success, error) -> Void in if success { ProgressHUD.showSuccess("删除成功") self.dataArray.removeObjectAtIndex((indexPath?.row)!) self.tableView?.reloadData() }else{ } }) } }inputView主要是在讨论区中,他可以自带的键盘和文本框,并且有评论这个按钮 可以将文本加入到tableView中
继承他的协议InputViewDelegate 从xib进行加载 在加入inputView的时候 最好下面覆盖一层灰色的背景layView
self.input = NSBundle.mainBundle().loadNibNamed("InputView", owner: self, options: nil).last as? InputView
func connect(){ //发表评论的时候 从xib加载发表评论的文件框,因此加载方法和纯代码创建的时候不同 if self.input == nil{ //从xib 加载的 只有一个对象 self.input = NSBundle.mainBundle().loadNibNamed("InputView", owner: self, options: nil).last as? InputView self.input?.frame = CGRectMake(0,SCREEN_HEIGHT - 44,SCREEN_WIDTH,44) //所有的动作都在delegate中 self.input?.delegate = self self.view.addSubview(self.input!) //当发表联系时,因马上出现键盘 self.input?.inputTextView?.becomeFirstResponder() } if self.layView == nil{ self.layView = UIView(frame: self.view.frame) self.layView?.backgroundColor = UIColor.grayColor() self.layView?.alpha = 0 let tap = UITapGestureRecognizer(target: self, action: "tapInputView") self.layView?.addGestureRecognizer(tap) //将某个界面插入到另外一个界面下 self.view.insertSubview(self.layView!, belowSubview: self.input!) } self.layView?.hidden = false }为layView添加点击事件 当一点击时 键盘消失
func tapInputView() { //当点击这个layView的时候 键盘就消失 self.input?.inputTextView?.resignFirstResponder() }
//实现inputView的delegate //当文本高度发生变化时,整个键盘向上移动 func textViewHeightDidChange(height: CGFloat) { //输入框的高度加10 并且输入框向上已 改变bottom self.input?.height = height + 10 self.input?.bottom = SCREEN_HEIGHT - CGFloat(self.keyBoardHeight) } //在inputView中,点击评论的时候 触发的动作 func publishButtonDidClick(button: UIButton!) { //加上进度的提示 ProgressHUD.show("") //传到leanCloud的后台 let object = AVObject(className: "discuss") object.setObject(self.input?.inputTextView?.text, forKey: "text") object.setObject(AVUser.currentUser(), forKey: "user") object.setObject(self.bookObject, forKey: "BookObject") object.saveInBackgroundWithBlock { (success, error) -> Void in if success{ ProgressHUD.showSuccess("评论成功") }else{ ProgressHUD.showError("评论失败") } } } func keyboardWillHide(inputView: InputView!, keyboardHeight: CGFloat, animationDuration duration: NSTimeInterval, animationCurve: UIViewAnimationCurve) { //当键盘消失时,设置键盘底部的高度为屏幕高度再加上Input的高度 UIView.animateWithDuration(duration, delay: 0, options: .BeginFromCurrentState, animations: { () -> Void in self.input?.bottom = SCREEN_HEIGHT + (self.input?.height)! self.layView?.alpha = 0.0 }, completion: {(finish) -> Void in //当键盘消失时,将layView再次隐藏起来 self.layView?.hidden = true }) } func keyboardWillShow(inputView: InputView!, keyboardHeight: CGFloat, animationDuration duration: NSTimeInterval, animationCurve: UIViewAnimationCurve) { //当键盘出现的时候 设置Input的键盘底部的高度离屏幕最上方的距离即设置bottom属性 //用一个动画来进行设置 self.keyBoardHeight = Double(keyboardHeight) UIView.animateWithDuration(duration, delay: 0, options: .BeginFromCurrentState, animations: { () -> Void in self.input?.bottom = SCREEN_HEIGHT - keyboardHeight //背景界面的透明度 self.layView?.alpha = 0.2 }) { (finish) -> Void in } }
//图片加载 还有默认的图片 self.bookTitleView?.cover?.sd_setImageWithURL(NSURL(string: (coverFile?.url)!), placeholderImage: UIImage(named: "Cover"))
注册初始化
//上拉加载 下拉刷新 self.tableView?.mj_header = MJRefreshNormalHeader(refreshingTarget: self, refreshingAction: "headerReFresh") self.tableView?.mj_footer = MJRefreshBackFooter(refreshingTarget: self, refreshingAction: "footerReFresh")
func headerReFresh() { //查询条件 let quary = AVQuery(className: "discuss") //倒序排序 quary.orderByAscending("createdAt") //表头加载的时候只需20个即可 不需要跳过已有的 quary.limit = 20 quary.skip = 0 quary.whereKey("user", equalTo: AVUser.currentUser()) quary.whereKey("BookObject", equalTo: self.bookObject) //将指针传回 quary.includeKey("user") quary.includeKey("BookObject") quary.findObjectsInBackgroundWithBlock { (results, error) -> Void in self.tableView?.mj_header.endRefreshing() self.dataArray.removeAllObjects() self.dataArray.addObject(results) self.tableView?.reloadData() } } func footerReFresh() { //查询条件 let quary = AVQuery(className: "discuss") //倒序排序 quary.orderByAscending("createdAt") //表尾加载的时候也需要20个 但需要跳过已经加载的 quary.limit = 20 quary.skip = self.dataArray.count quary.whereKey("user", equalTo: AVUser.currentUser()) quary.whereKey("BookObject", equalTo: self.bookObject) //将指针传回 quary.includeKey("user") quary.includeKey("BookObject") quary.findObjectsInBackgroundWithBlock { (results, error) -> Void in self.tableView?.mj_footer.endRefreshing() //self.dataArray.removeAllObjects() self.dataArray.addObject(results) self.tableView?.reloadData() }progressHUD类似于警告框的作用,感觉以后自己也不用那么麻烦协警告框了
ProgressHUD.show("", interaction:false) ProgressHUD.dismiss() self.dismissViewControllerAnimated(true, completion: nil) }else { if error.code == 210{ ProgressHUD.showError("用户名或密码错误") }else if error.code == 211{ ProgressHUD.showError("不存在该用户") }else if error.code == 216{ ProgressHUD.showError("未验证邮箱") }else if error.code == 1{ ProgressHUD.showError("操作频繁") }else { ProgressHUD.showError("登陆失败")XKeyBoard主要是用在一些当问文字处理的时候 要出现键盘 随后键盘的遮挡问题
//注册键盘出现和消失 XKeyBoard.registerKeyBoardHide(self) XKeyBoard.registerKeyBoardShow(self)
随后实现通知当键盘出现的时候和键盘消失的时候
//键盘遮挡 func keyboardWillHideNotification(notifacition:NSNotification) { self.textView?.contentInset = UIEdgeInsetsMake(0, 0,0, 0) } func keyboardWillShowNotification(notifacition:NSNotification) { //返回键盘的大小 let rect = XKeyBoard.returnKeyBoardWindow(notifacition) self.textView?.contentInset = UIEdgeInsetsMake(0, 0, rect.size.height, 0) } }
func keyboardWillHideNotification(notifacition:NSNotification) { UIView.animateWithDuration(0.3) { () -> Void in self.topLayout.constant = 0 //加载新的约束 self.view.layoutIfNeeded() } } func keyboardWillShowNotification(notifacition:NSNotification) { //做一个动画 UIView.animateWithDuration(0.3) { () -> Void in self.topLayout.constant = -200 //加载新的约束 self.view.layoutIfNeeded() } }IGLDropDownMenu主要是下滑的时候的一个动画的效果 实现协议IGLDropDownMenuDelegate
var dropDownMenu1:IGLDropDownMenu? var dropDownMenu2:IGLDropDownMenu?
</pre><pre code_snippet_id="1589511" snippet_file_name="blog_20160226_18_9938298" name="code" class="plain"> self.initDropArray() self.createDropMenu(self.literatureArray1, array2: self.literatureArray2)将数组初始化为这个menu的元素
func createDropMenu(array1:Array<NSDictionary>,array2:Array<NSDictionary>){ let dropDownItem1 = NSMutableArray() for var i = 0;i<array1.count;i++ { let dict = array1[i] let item = IGLDropDownItem() item.text = dict["title"] as? String dropDownItem1.addObject(item) } let dropDownItem2 = NSMutableArray() for var i = 0;i<array2.count;i++ { let dict = array2[i] let item = IGLDropDownItem() item.text = dict["title"] as? String dropDownItem2.addObject(item) } //重绘的操作 self.dropDownMenu1?.removeFromSuperview() self.dropDownMenu1 = IGLDropDownMenu() self.dropDownMenu1?.menuText = "点我,展开详细列表" self.dropDownMenu1?.menuButton.textLabel.adjustsFontSizeToFitWidth = true self.dropDownMenu1?.menuButton.textLabel.textColor = setColor(38, g: 82, b: 67) self.dropDownMenu1?.paddingLeft = 15 self.dropDownMenu1?.delegate = self //动画 self.dropDownMenu1?.type = .Stack self.dropDownMenu1?.itemAnimationDelay = 0.1 self.dropDownMenu1?.gutterY = 5 self.dropDownMenu1?.dropDownItems = dropDownItem1 as [AnyObject] self.dropDownMenu1?.frame = CGRectMake(20, 150, SCREEN_WIDTH/2-30, (SCREEN_HEIGHT-200)/7) self.view.addSubview(self.dropDownMenu1!) self.dropDownMenu1?.reloadView() self.dropDownMenu2?.removeFromSuperview() self.dropDownMenu2 = IGLDropDownMenu() self.dropDownMenu2?.menuText = "点我,展开详细列表" self.dropDownMenu2?.menuButton.textLabel.adjustsFontSizeToFitWidth = true self.dropDownMenu2?.menuButton.textLabel.textColor = setColor(38, g: 82, b: 67) self.dropDownMenu2?.paddingLeft = 15 self.dropDownMenu2?.delegate = self self.dropDownMenu2?.type = .Stack self.dropDownMenu2?.itemAnimationDelay = 0.1 self.dropDownMenu2?.gutterY = 5 self.dropDownMenu2?.dropDownItems = dropDownItem2 as [AnyObject] self.dropDownMenu2?.frame = CGRectMake(SCREEN_WIDTH/2+10, 150, SCREEN_WIDTH/2-30, (SCREEN_HEIGHT-200)/7) self.view.addSubview(self.dropDownMenu2!) self.dropDownMenu2?.reloadView() } //dropDownMenu的delegate func dropDownMenu(dropDownMenu: IGLDropDownMenu!, selectedItemAtIndex index: Int) { if dropDownMenu == self.dropDownMenu1 { let item = self.dropDownMenu1?.dropDownItems[index] as? IGLDropDownItem self.detailType = (item?.text)! self.dropDownMenu2?.menuButton.text = self.detailType }else{ let item = self.dropDownMenu2?.dropDownItems[index] as? IGLDropDownItem self.detailType = (item?.text)! self.dropDownMenu1?.menuButton.text = self.detailType } } }
AKSegmentedControl主要是选择栏的加强版 个人认为,这里是和上面的dropMenu联合使用的 是做一个动画,所以在有些工程中,可以不用的
var segmentController1:AKSegmentedControl? var segmentController2:AKSegmentedControl?
//初始化segment func initSegment() { let buttonArray1 = [ ["image":"ledger","title":"文学","font":MY_FONT], ["image":"drama masks","title":"人文社科","font":MY_FONT],["image":"aperture","title":"生活","font":MY_FONT], ] let buttonArray2 = [ ["image":"atom","title":"经管","font":MY_FONT], ["image":"alien","title":"科技","font":MY_FONT], ["image":"fire element","title":"网络流行","font":MY_FONT], ] self.segmentController1 = AKSegmentedControl(frame: CGRectMake(10,50,SCREEN_WIDTH - 20,37)) self.segmentController1?.initButtonWithTitleandImage(buttonArray1) self.view.addSubview(segmentController1!) self.segmentController2 = AKSegmentedControl(frame: CGRectMake(10,110,SCREEN_WIDTH - 20,37)) self.segmentController2?.initButtonWithTitleandImage(buttonArray2) self.view.addSubview(self.segmentController2!) segmentController1?.addTarget(self, action: "segmentControllerAction:", forControlEvents: .ValueChanged) segmentController2?.addTarget(self, action: "segmentControllerAction:", forControlEvents: .ValueChanged) } func segmentControllerAction(segment:AKSegmentedControl){ let index = segment.selectedIndexes.firstIndex if segment == self.segmentController1{ //把2的点击效果取消掉 self.segmentController2?.setSelectedIndex(3) }else{ self.segmentController1?.setSelectedIndex(3) } self.type = ((segment.buttonsArray[index]) as! UIButton).currentTitle! if self.dropDownMenu1 != nil { self.dropDownMenu1?.resetParams() } if self.dropDownMenu2 != nil { self.dropDownMenu2?.resetParams() } switch (index){ case 0: self.createDropMenu(self.literatureArray1, array2: self.literatureArray2) break case 1: self.createDropMenu(self.humanitiesArray1, array2: self.humanitiesArray2) break case 2: self.createDropMenu(self.livelihoodArray1, array2: self.livelihoodArray2) break case 3: self.createDropMenu(self.economiesArray1, array2: self.economiesArray2) break case 4: self.createDropMenu(self.technologyArray1, array2: self.technologyArray2) break case 5: self.createDropMenu(self.NetworkArray1, array2: self.NetworkArray2) break default: break } }
var BookName:JVFloatLabeledTextField? var BookEditor:JVFloatLabeledTextField?
self.BookName = JVFloatLabeledTextField(frame: CGRectMake(128,8+40,SCREEN_WIDTH-128-15,30)) self.BookEditor = JVFloatLabeledTextField(frame: CGRectMake(128,8+70+40,SCREEN_WIDTH-128-15,30)) self.BookName?.placeholder = "书名" self.BookEditor?.placeholder = "作者" self.BookName?.floatingLabelFont = UIFont(name: MY_FONT, size: 14) self.BookEditor?.floatingLabelFont = UIFont(name: MY_FONT, size: 14)LDXScore主要是一个加星星的一个评分的view吧
self.Score = LDXScore(frame: CGRectMake(100,10,100,22)) //是否可以编辑 self.Score?.isSelect = true self.Score?.normalImg = UIImage(named:"btn_star_evaluation_normal") self.Score?.highlightImg = UIImage(named: "btn_star_evaluation_press") self.Score?.max_star = 5 //一出来就是5颗 self.Score?.show_star = 5可以把score读出来 应show_Star
self.Score?.show_star
func getImageFromPicker(image: UIImage) { let CropVC = VPImageCropperViewController(image: image, cropFrame: CGRectMake(0,100,SCREEN_WIDTH,SCREEN_WIDTH * 1.273), limitScaleRatio: 3) CropVC.delegate = self self.presentViewController(CropVC, animated: true, completion: nil) }
func imageCropper(cropperViewController: VPImageCropperViewController!, didFinished editedImage: UIImage!) { self.BookTitle?.BookCover?.setImage(editedImage, forState: .Normal) cropperViewController.dismissViewControllerAnimated(true, completion: nil) } func imageCropperDidCancel(cropperViewController: VPImageCropperViewController!) { cropperViewController.dismissViewControllerAnimated(true, completion: nil) }