何以年入十万葡京网上娱乐场?

 年入十万实际上依旧相比便于的事体,大概意思就是月入8000-10000,前者的是睡前十万,后者是税后十万,那个级其余进项相应如今居于大城市的中低收入,小城市的中高低收入,所以从这些角度来说,不同的城池也会有两样的做法。

swift:自定义UICollectionViewFlowLayout

 对于小城市而言,近期的广阔收入大约在3000上下,五六千的算高薪,两千以内的算低薪。这里需要专注的是,这并不是一个能力问题,而是一个环境问题,小城市可能并从未月薪十万的地方,而大城市比如北上广,你是有其一空子的。所以我们要理解自己城市的受制,而不是一直的追求本地都不设有的高薪。相应的,小城市的生存成本也会相比较低,这第一呈现在时间成本相比较低上,你不需要跑很远的地方上班,你也没有更大的竞争压力,所以您有很丰盛的年华。

编写目的

UICollectionView是ios中一个异常有力的控件,利用它可以异常简便的落实部分很为难的功力。UICollectionView的效劳又凭借于UICollectionViewLayout抑或它的子类UICollectionViewFlowLayout。而关于自定义UICollectionViewFlowLayout网上介绍的可比少。出于这一目的,写下这边文章,希望可以匡助初学者(我也是)实现部分简便的流水布局功用。下边的示范就是本篇作品的对象。最终版代码和富有图片素材(图片名和档次中有点不平等)已经上传至葡京网上娱乐场,Github,大家可以下载学习。

葡京网上娱乐场 1

小城市有一份两三千的办事如故相比较轻松的,所以你要年入十万的话,就要用别样的不二法门来补上剩下的5000-7000的获益。这种补充大概有五个趋势,第一个方向是本着地点做一些劳务和职业,另一个样子则是在网上讨些生活。针对本土做事情那个不赘述,低端的可以晚上去夜市摆摊,你说这么赚不到何等钱,其实您只是亟需扩张部分新的章程。把您的客户都加到微信上,这样经过你短期不懈的摆摊,借使能加到一个地带五千人,也基本得以影响全县了。这时候其实你就成了一个媒体,你可以收我们50-200块,发一些本市被的找猫找狗找工作的帖子,当一个人肉的赶集网。一天发两条,大概就能赚到三千块,假如多一点,五六千很自在,可能中期积累需要点时间,当您开头贩卖消息推广的时候,收入依然相比较客观的。反正也不贵,我们也都会尝试的。当然,你如若这般卖东西,也可能会大增很多收入,这大概是微商的另一种办法了。

多少个大概的定义

  • UICollectionViewLayout与UICollectionViewFlowLayout

UICollectionView的来得效果几乎百分之百由UICollectionViewLayout担负(甚至是cell的高低)。所以,一般开发中所说的自定义UICollectionView也就是自定义UICollectionViewLayout。而UICollectionViewFlowLayout是继承自UICollectionViewLayout的,由苹果官方实现的流水布局效率。虽然想自己实现部分流水布局效率可以继续自最原始UICollectionViewLayout从头写,也足以延续自UICollectionViewFlowLayout拓展改动。文本是延续自UICollectionViewFlowLayt*

  • UICollectionViewLayoutAttributes

其次点就说了UICollectionView的显得效果几乎任何由UICollectionViewLayout担当,而真正存储着每一个cell的职务、大小等性能的是UICollectionViewLayoutAttributes。每一个cell对应着一个属于自己的UICollectionViewLayoutAttributes,而UICollectionViewLayout正是利用UICollectionViewLayoutAttributes里存在的音讯对每一个cel进行布局。

  • 流水布局

所谓流水布局就是:就是cell以自然的规律举办如同流水一般的有规律的一个随后一个的排列。�最经典的湍流布局便是九宫格布局,绝大部分的图样采取器也是流水布局。

下边这些思想,是传统职业加互联网的考虑,单纯的价值观开个麻将馆、小旅社,或者去开个Taobao店,卖些特产,也会对家用有些补贴,不过能无法到月入五千的境界,我认为是有些悬的。因为这就碰到了本土市场的平分获益率的熏陶。假设很赚钱了,很快就会有别人在两旁开一个。当然,电商也很耗精力,尽管达到一个毋庸置疑的低收入,可能会潜移默化工作。当然,小地点也就是这样了,空间所限加你的力量所限,可以挑选的事物并不多。

未雨绸缪干活

  • xcode7.0
  • swift2.0
  • 投机本身提供的素材并在控制器中添加如下代码

class ViewController: UIViewController,UICollectionViewDelegate, UICollectionViewDataSource {

    lazy var imageArray: [String] = {

        var array: [String] = []

        for i in 1...20 {
            array.append("\(i)-1")
        }

        return array
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        let collectionView =  UICollectionView(frame: CGRectMake(0, 100, self.view.bounds.width, 200), collectionViewLayout: UICollectionViewFlowLayout())
        collectionView.backgroundColor = UIColor.blackColor()
        collectionView.dataSource  = self
        collectionView.delegate = self

        collectionView.registerClass(ImageTextCell.self, forCellWithReuseIdentifier: "ImageTextCell")
        self.view.addSubview(collectionView)
    }

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return self.imageArray.count;
    }

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("ImageTextCell", forIndexPath: indexPath) as! ImageTextCell
        cell.imageStr = self.imageArray[indexPath.item]

        return cell
    }

}
//这里是自定义cell的代码
class ImageTextCell: UICollectionViewCell {

    var imageView: UIImageView?
    var imageStr: NSString? {

        didSet {
            self.imageView!.image = UIImage(named: self.imageStr as! String)
        }

    }

    override init(frame: CGRect) {
        super.init(frame: frame)

        self.imageView = UIImageView()
        self.addSubview(self.imageView!)

    }

    override func layoutSubviews() {
        super.layoutSubviews()
        self.imageView?.frame = self.bounds
    }

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

}

功能应该是这么的

葡京网上娱乐场 2

大城市则正好相反,大城市机会很多,得到高薪的机会也很多,最大的问题要么时间成本,上下班的时日相比久,一时辰之内都算是少的,多少都要1-2刻钟,据说极端的还有三钟头的。这实在才是最不好的事务。月入八千大致是一个名校本科生工作两年左右的薪饷,也可能是一个硕士毕业当年的薪金,部分毕业就拿到十几万几十万年薪的高端人才,不在其中。所以在大城市一般到月入八千都不需要咋样技术含量,工作首先年4-6K的薪金,第二年跳槽就足以了。

编码

如果没有学历的话,可能就会不好一些,如果做服务员大概月薪在3000左右包吃住,大概相当于月薪五千的水平。因为服务员会消耗大量的日子,所以说,增值的上空大都在店铺的其中绩效提成上。而工人大都都得以得到一天200-300的日薪,有的可能还更高一些,所以只要努力些,月入八千不算一个很难的低收入。实在可怜也足以送快递,这属于收入比价高门槛相比较低的本行,就是麻烦。

水平排列

创设一个名为LineLayout.swift的文件(继承自UICollectionViewFlowLayout)。添加如下几行代码

    var itemW: CGFloat = 100
    var itemH: CGFloat = 100

    override init() {
        super.init()

        //设置每一个元素的大小
        self.itemSize = CGSizeMake(itemW, itemH)
        //设置滚动方向
        self.scrollDirection = .Horizontal
        //设置间距
        self.minimumLineSpacing = 0.7 * itemW
    }

    //苹果推荐,对一些布局的准备操作放在这里
    override func prepareLayout() {
        //设置边距(让第一张图片与最后一张图片出现在最中央)ps:这里可以进行优化
        let inset = (self.collectionView?.bounds.width ?? 0)  * 0.5 - self.itemSize.width * 0.5
        self.sectionInset = UIEdgeInsetsMake(0, inset, 0, inset)
    }

效果就成了这般

葡京网上娱乐场 3

当然,假设不想麻烦,你来大城市干嘛呢?

shouldInvalidateLayoutForBoundsChange方法与layoutAttributesForElementsInRect方法关系

题目所写出的是异常着重的两方法,先看自己添加的如下测试代码

    /**
    返回true只要显示的边界发生改变就重新布局:(默认是false)
    内部会重新调用prepareLayout和调用
    layoutAttributesForElementsInRect方法获得部分cell的布局属性
    */
    override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool {
        print(newBounds)
        return true
    }

    /**
    用来计算出rect这个范围内所有cell的UICollectionViewLayoutAttributes,
    并返回。
    */
    override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        print("layoutAttributesForElementsInRect==\(rect)")
        let ret = super.layoutAttributesForElementsInRect(rect)
//        print(ret?.count)
        return ret
    }

为了诠释,我添加了多少个打印语句,在shouldInvalidateLayoutForBoundsChange再次来到值设置为true后,会发现layoutAttributesForElementsInRect办法调用异常屡次,几乎是每滑动一点就会调用五遍。观看打印音信可以窥见众多秘密

  • 起步程序有如下打印

layoutAttributesForElementsInRect==(0.0, 0.0, 568.0, 568.0)

接近看不太懂,没事,尝试滑动。

  • 滑动

(0.5, 0.0, 320.0, 200.0) //这个是shouldInvalidateLayoutForBoundsChange方法的打印的newBounds
layoutAttributesForElementsInRect==(0.0, 0.0, 568.0, 568.0)//这个是layoutAttributesForElementsInRect打印的rect
(1.5, 0.0, 320.0, 200.0) 
layoutAttributesForElementsInRect==(0.0, 0.0, 568.0, 568.0)
(3.5, 0.0, 320.0, 200.0)
layoutAttributesForElementsInRect==(0.0, 0.0, 568.0, 568.0)
...

轻易窥见,shouldInvalidateLayoutForBoundsChange的参数newBounds的意趣是UICollectionView的可见矩形。什么叫可见矩阵?,因为UICollectionView也是UIScrollView的子类,所以它确实的“内容”远远不止我们屏幕上收看的那么多(这里不再话时间持续解释可见矩阵)。这好像layoutAttributesForElementsInRect打印出来的事物没有吗变化是怎么回事?不急继续滑动。

  • 解密

连续滑动后有这么些音讯,经过删除一些无用音讯,突显如下。(注意看有注释的行)

...
(248.0, 0.0, 320.0, 200.0)
layoutAttributesForElementsInRect==(0.0, 0.0, 568.0, 568.0)
(249.0, 0.0, 320.0, 200.0)  //这里是可见矩阵
layoutAttributesForElementsInRect==(0.0, 0.0, 1136.0, 568.0)  //这里变化了1136.0是568.0的2倍(1136代表的是宽度的意思应该知道不需要解释吧)
(250.0, 0.0, 320.0, 200.0)
layoutAttributesForElementsInRect==(0.0, 0.0, 1136.0, 568.0)
...
(567.5, 0.0, 320.0, 200.0)
layoutAttributesForElementsInRect==(0.0, 0.0, 1136.0, 568.0)
(568.5, 0.0, 320.0, 200.0)//这里是可见矩阵
layoutAttributesForElementsInRect==(568.0, 0.0, 568.0, 568.0)  // 这里又变化了,x变成了568,宽度变成了568
(571.0, 0.0, 320.0, 200.0)
layoutAttributesForElementsInRect==(568.0, 0.0, 568.0, 568.0)
...
(815.0, 0.0, 320.0, 200.0)
layoutAttributesForElementsInRect==(568.0, 0.0, 568.0, 568.0)
(817.0, 0.0, 320.0, 200.0)
layoutAttributesForElementsInRect==(568.0, 0.0, 1136.0, 568.0) //还有这里
...
(1135.0, 0.0, 320.0, 200.0)
layoutAttributesForElementsInRect==(568.0, 0.0, 1136.0, 568.0)
(1136.0, 0.0, 320.0, 200.0)
layoutAttributesForElementsInRect==(1136.0, 0.0, 568.0, 568.0)  //还有这里

上面的的多寡显示莫过于早就足足解释一切了。读到这里,推荐你自己去找找规律,通过自己发现的奥秘相比较直接看我写出答案有含义的多!下边这张图例已经阐明了全体

葡京网上娱乐场 4

有关缘何会是568的倍数。。因为我是用的5s模拟器。你换成4s就变成480了。至于这样设计的理由,我预计是为了有利于开展限制的规定。

缩放效果

掌握了下面shouldInvalidateLayoutForBoundsChange方法与layoutAttributesForElementsInRect方法关系后,可以连续拓展编码了。因为根本的始末已经讲解截止,剩下的就只是局部动画片的总括,所以不再继续教师,直接贴出代码。

class LineLayout: UICollectionViewFlowLayout {

    var itemW: CGFloat = 100
    var itemH: CGFloat = 100

    lazy var inset: CGFloat = {
        //这样设置,inset就只会被计算一次,减少了prepareLayout的计算步骤
        return  (self.collectionView?.bounds.width ?? 0)  * 0.5 - self.itemSize.width * 0.5
        }()

    override init() {
        super.init()

        //设置每一个元素的大小
        self.itemSize = CGSizeMake(itemW, itemH)
        //设置滚动方向
        self.scrollDirection = .Horizontal
        //设置间距
        self.minimumLineSpacing = 0.7 * itemW
    }

    //苹果推荐,对一些布局的准备操作放在这里
    override func prepareLayout() {

        //设置边距(让第一张图片与最后一张图片出现在最中央)
        self.sectionInset = UIEdgeInsetsMake(0, inset, 0, inset)
    }

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

    /**
    返回true只要显示的边界发生改变就重新布局:(默认是false)
    内部会重新调用prepareLayout和调用
    layoutAttributesForElementsInRect方法获得部分cell的布局属性
    */
    override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool {
        return true
    }

    /**
    用来计算出rect这个范围内所有cell的UICollectionViewLayoutAttributes,
    并返回。
    */
    override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        //取出rect范围内所有的UICollectionViewLayoutAttributes,然而
        //我们并不关心这个范围内所有的cell的布局,我们做动画是做给人看的,
        //所以我们只需要取出屏幕上可见的那些cell的rect即可
        let array = super.layoutAttributesForElementsInRect(rect)

        //可见矩阵
        let visiableRect = CGRectMake(self.collectionView!.contentOffset.x, self.collectionView!.contentOffset.y, self.collectionView!.frame.width, self.collectionView!.frame.height)

        //接下来的计算是为了动画效果
        let maxCenterMargin = self.collectionView!.bounds.width * 0.5 + itemW * 0.5;
        //获得collectionVIew中央的X值(即显示在屏幕中央的X)
        let centerX = self.collectionView!.contentOffset.x + self.collectionView!.frame.size.width * 0.5;
        for attributes in array! {
            //如果不在屏幕上,直接跳过
            if !CGRectIntersectsRect(visiableRect, attributes.frame) {continue}
            let scale = 1 + (0.8 - abs(centerX - attributes.center.x) / maxCenterMargin)
            attributes.transform = CGAffineTransformMakeScale(scale, scale)
        }

        return array
    }

    /**
    用来设置collectionView停止滚动那一刻的位置

    - parameter proposedContentOffset: 原本collectionView停止滚动那一刻的位置
    - parameter velocity:              滚动速度

    - returns: 最终停留的位置
    */
    override func targetContentOffsetForProposedContentOffset(proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
        //实现这个方法的目的是:当停止滑动,时刻有一张图片是位于屏幕最中央的。

        let lastRect = CGRectMake(proposedContentOffset.x, proposedContentOffset.y, self.collectionView!.frame.width, self.collectionView!.frame.height)
        //获得collectionVIew中央的X值(即显示在屏幕中央的X)
        let centerX = proposedContentOffset.x + self.collectionView!.frame.width * 0.5;
        //这个范围内所有的属性
        let array = self.layoutAttributesForElementsInRect(lastRect)

        //需要移动的距离
        var adjustOffsetX = CGFloat(MAXFLOAT);
        for attri in array! {
            if abs(attri.center.x - centerX) < abs(adjustOffsetX) {
                adjustOffsetX = attri.center.x - centerX;
            }
        }

        return CGPointMake(proposedContentOffset.x + adjustOffsetX, proposedContentOffset.y)
    }
}

一经在控制器中进入下边多少个办法,在您点击控制器,或者点击某个cell会有很炫的动画片发生,那都是苹果帮我们做好的。

    func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {

        self.imageArray.removeAtIndex(indexPath.item)

        collectionView.deleteItemsAtIndexPaths([indexPath])
    }

        override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {

        if self.collectionView!.collectionViewLayout.isKindOfClass(LineLayout.self) {
            self.collectionView!.setCollectionViewLayout(UICollectionViewFlowLayout(), animated: true)
        }else {
            self.collectionView!.setCollectionViewLayout(LineLayout(), animated: true)
        }

    }

总结

本篇作品记录了自家在自定义UICollectionViewFlowLayout过程中境遇的有的题目和化解措施(其实有一部分坑爹的问题我尚未列出,怕误导我们)。下边的全体都是基于UICollectionViewFlowLayout进展的更改。而自己在GitHub下面上传的也有一份继承自UICollectionViewLayout的非流水布局。效果如下,因为原理性的东西都差不多,就不再举办分析(代码也有注释)。感兴趣的可以这Github上边下载。假设作品中有咋样错误或者更好的主意、指出等等,感谢您的建议。我们一起学习!O(∩_∩)O!

葡京网上娱乐场 5

后记

本身不会报告您,介绍UICollectionView的自定义布局这篇著作,是自己下一个实验的前传。不过如今被老师强迫帮他们去写文档,估量进度得放缓。