美文网首页 ios零碎记录iOS进阶work
(iOS)希望这本《iOS自定义控件剖析》书籍能够让学习中的你有

(iOS)希望这本《iOS自定义控件剖析》书籍能够让学习中的你有

作者: ZeroJ | 来源:发表于2016-11-01 19:49 被阅读14544次

    已经一两个月没有更新过博客了, 不过这两个月并没有闲下来, 只是在完成以前欠下的的任务. 几个月前就开始动手写一本iOS开发方面的书籍, 希望这本书籍是实用性比较强的一本书. 不过在期间因为学习和生活上的琐事耽误了很多, 所以就被搁置了很久. 最近的一两个月, 终于又下定决心将这本未完成的书籍写完. 这两个月就把大多数的课余时间用在了完成这本书籍, 所以博客也很长时间没有更新过了. 不过还好, 目前已经顺利完成了.

    书籍中实现了接近20个实际开发中将会遇到的一些效果, 下面是使用的方法和使用的效果. 即使你没有购买书籍, 也是可以获取到他们的源码,并且直接使用的, 因为笔者已经上传到了github上面了.你可以点击相关的链接直接下载. 当然如果购买了书籍, 书籍中将会详细讲解每一个效果的实现的, 你可以从零开始, 跟随着讲解, 一步一步的亲自实现这些效果. 相信你会有收获.然后你的github上面也是可以新增不少的responsibility了.

    • 我最初学习iOS开发的时候, 是按照网上讲的iOS开发学习路径进行学习.购买了相关的书籍, 下载了相关的视频, 然后就开始了一段不长不短的学习历程. 当时swift的应用很不广泛, 所以最初是学习Objective-C. 当学完了相关的书籍和视频之后,自以为已经学得不错, 可以开发实际的项目了. 当时正好有机会参与到一个外包项目的开发. 不过当一开始的时候, 才真的发现自己太年轻了.书籍上学到的只是一些基本的语法和一些系统基本的API. 拿着设计给的产品原型, 毫无头绪怎么实现一个个看上去很简单的效果. 于是就只能各种的百度, Google, 然后才渐渐的实现了一些效果. 不过当时根本不能自定义系统提供的控件实现设计给的效果. 所以只能在github上面不断的找类似的效果的第三方. 记忆最深刻的是,当时好不容易在github上面找到一个圆形进度条, 但是项目中需要的效果不太一样, 需要在进度条的末端加上一个在圆环上滚动的圆点, 无奈, 当时能力不足, 修改实现这个简单的效果也用了一天多. 所以, 我一直很尊敬和感激那些第三方的开发者, 在我最初开始iOS开发的时候提供了很多的帮助, 同时在以后的项目中提供了便利.尽管有些是很容易自己实现的简单的效果, 不过对于一些朋友来说, 可能也真的是需要的. 所以, 我也一直希望能够做一些类似的事情.


    </br>

    leading1.gif
    // 如果是第一次安装打开App --- 显示引导页面
        ZJLeadingPageController *leadController = [[ZJLeadingPageController alloc] initWithPagesCount:5 setupCellHandler:^(ZJLeadingPageCell *cell, NSIndexPath *indexPath) {
            
            // 设置图片
            NSString *imageName = [NSString stringWithFormat:@"wangyiyun%ld",indexPath.row];
            cell.imageView.image = [UIImage imageNamed:imageName];
    
            // 设置按钮属性
            [cell.finishBtn setTitle:@"立即体验" forState:UIControlStateNormal];
            [cell.finishBtn setTitleColor:[UIColor orangeColor] forState:UIControlStateNormal];
            
        } finishHandler:^(UIButton *finishBtn) {
            NSLog(@"点击了完成按钮-----");
        }];
        // 自定义属性
        leadController.pageControl.pageIndicatorTintColor = [UIColor yellowColor];
        leadController.pageControl.currentPageIndicatorTintColor = [UIColor purpleColor];
    
    launch.gif
    ZJLaunchAdController *launchVc = [[ZJLaunchAdController alloc] initWithLaunchImage:nil setAdImageHandler:^(UIImageView *imageView) {
            // 这里可以直接使用SDWebimage等来请求服务器提供的广告图片(SDWebimage会处理好gif图片的显示)
            // 不过你需要注意选择SDWebimage的缓存策略
            imageView.image = [UIImage imageNamed:@"adImage"];
            
        } finishHandler:^(ZJLaunchAdCallbackType callbackType) {
            switch (callbackType) {
                case ZJLaunchAdCallbackTypeClickAd:
                    // 点击了广告, 展示相应的广告即可
                    NSLog(@"点击了广告, 展示相应的广告即可");
                    
                    break;
                case ZJLaunchAdCallbackTypeShowFinish:
                    NSLog(@"展示广告图片结束, 可以进入App");
    
                    break;
                case ZJLaunchAdCallbackTypeClickSkipBtn:
                    NSLog(@"点击了跳过广告, 可以进入App");
    
                    break;
            }
        }];
    
    • ZJPPTView 可以玩出花样的轮播器, 内部不依赖第三方库, 使用简单, 可自定义轮播任何内容. 图片加载等类似tableView使用代理加载, 可自己选择第三方库来加载图片等.
    ppt.gif
        _defaultPPT = [[ZJPPTViewDefault alloc] initWithDelegate:self];
        _defaultPPT.pageControlPositon = ZJPPTViewPageControlPositionBottomCenter;
        - (void)pptView:(ZJPPTViewOC *)pptView setUpPageCell:(UICollectionViewCell *)cell withIndex:(NSInteger)index {
            if (pptView == _defaultPPT) {
                ZJPPTViewDefaultCell *defaultCell = (ZJPPTViewDefaultCell *)cell;
                // 可自定义文字属性 ...
                //    defaultCell.textLabel.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5];
                //    defaultCell.textLabel.textAlignment = NSTextAlignmentCenter;
                //    defaultCell.textLabel.textColor = [UIColor whiteColor];
                defaultCell.textLabel.text = [NSString stringWithFormat:@"      这是第: %ld 页", index];
                // 设置图片  网络图片, 可自由使用SDWebimage等来加载
                if (index%2 == 0) {
                    UIImage *image = [UIImage imageNamed:@"1"];
                    defaultCell.imageView.image = image;
                }
                else {
                    UIImage *image = [UIImage imageNamed:@"2"];
                    defaultCell.imageView.image = image;
                }
                
            }
        }
    
    progressHUD.gif
     // 显示加载成功的图片和文字提示, 1s后自动隐藏
                [ZJProgressHUD showSuccessWithStatus:@"加载成功!!" andAutoHideAfterTime:1.f];
                // 显示加载动画, 需要加载完成后调用hideHUD隐藏
                [ZJProgressHUD showProgressWithStatus:@"正在努力加载中..."];
                dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
                    // 加载完后 移除提示框
                    [ZJProgressHUD hideHUD];
                });
    
    • ZJActionSheet 自定义UIActionSheet, 系统的UIActionSheet用着很不方便自定义, 比如修改文字的颜色, 大小, 以及显示图片等很不方便, 那么我们可以自己写一个, 然后类似下面这样的效果.
    actionSheet.gif
      ZJActionSheetItem *item8 = [[ZJActionSheetItem alloc] initWithTitle:@"可以自定义所有item的字体颜色 大小等" image:nil handler:^(ZJActionSheetView *actionSheet) {
            NSLog(@"点击了收藏");
        }];
        ZJActionSheetItem *item9 = [[ZJActionSheetItem alloc] initWithTitle:@"可以设置actionSheet居中或者居下显示" image:nil handler:^(ZJActionSheetView *actionSheet) {
            NSLog(@"点击了收藏");
        }];
    
        ZJActionSheetView *actionSheet = [[ZJActionSheetView alloc] initWithTitle:@"这是提示title" subtitle:@"这是详细说明文字,字体默认14,可修改subtitleLabel" actionSheetItems:@[item1, item2, item3,item4,item5,item6,item7,item8,item9]];
        // 显示
        [actionSheet show];
    
    circleProgress.gif
    self.progressView = [[ZJCircleProgressView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    // 背景色
    self.progressView.trackBackgroundColor = [UIColor yellowColor];
    // 进度颜色
    self.progressView.trackColor = [UIColor greenColor];
    self.progressView.headerImage = [self drawImage];
    // 开始角度位置
    //    self.progressView.beginAngle =
    // 自定义progressLabel的属性...
    self.progressView.progressLabel.textColor = [UIColor lightGrayColor];
    //    self.progressView.progressLabel.hidden = YES;
    [self.view addSubview:self.progressView];
    
    - (IBAction)slide:(id)sender {
        UISlider *slider = (UISlider *)sender;
        // 改变进度
        self.progressView.progress = slider.value;
        self.pieProgressView.progress = slider.value;
    
    }
    
    contacts.gif
     NSArray *testArray = @[@"ZeroJ", @"曾晶", @"你好", @"曾晶", @"曾晶" , @"曾晶" , @"曾晶" , @"曾晶" , @"曾晶" , @"曾晶" , @"曾晶",  @"曾好", @"李涵", @"王丹", @"良好", @"124"];
        
        NSMutableArray<ZJContact *> *contacts = [NSMutableArray arrayWithCapacity:testArray.count];
        for (NSString *name in testArray) {
            ZJContact *test = [ZJContact new];
            test.name = name;
            test.icon = [UIImage imageNamed:@"icon"];
            [contacts addObject:test];
        }
    
        [self setupInitialAllDataArrayWithContacts:contacts];
    
    citySelecte.gif
        ZJCityViewControllerOne *vc = [[ZJCityViewControllerOne alloc] initWithDataArray:nil];
    //    __weak typeof(self) weakSelf = self;
        [vc setupCityCellClickHandler:^(NSString *title) {
            
            NSLog(@"选中的城市是: %@", title);
            [ZJProgressHUD showStatus:[NSString stringWithFormat:@"选中的城市是: %@", title] andAutoHideAfterTime:1.f];
    //        [weakSelf.navigationController popViewControllerAnimated:YES];
        }];
        [self.navigationController showViewController:vc sender:nil];
    
    pickerView.gif
              [ZJUsefulPickerView showSingleColPickerWithToolBarText:@"单列数据" withData:@[@"objective-C", @"swift", @"iOS", @"iPad", @"iPod", @"mac", @"java", @"php", @"JavaScript"] withDefaultIndex:3 withCancelHandler:^{
                    NSLog(@"quxiaole -----");
                    
                } withDoneHandler:^(NSInteger selectedIndex, NSString *selectedValue) {
                    NSLog(@"%@---%ld", selectedValue, selectedIndex);
                    
                }];
                
                // 省市区选择
                [ZJUsefulPickerView showCitiesPickerWithToolBarText:@"省市区选择" withDefaultSelectedValues:@[@"四川", @"成都", @"郫县"] withCancelHandler:^{
                    NSLog(@"quxiaole -----");
    
                } withDoneHandler:^(NSArray *selectedValues) {
                    NSLog(@"%@---", selectedValues);
    
                }];
    
    drawer1.gif drawer2.gif
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        ZJLeftViewController *left = [ZJLeftViewController new];
        
        ZJCenterViewController *center = [ZJCenterViewController new];
        
        UINavigationController *navi = [[UINavigationController alloc] initWithRootViewController:center];
        
        ZJRightViewController *right = [ZJRightViewController new];
        
        ZJDrawerController *drawer = [[ZJDrawerController alloc] initWithLeftController: left centerController:navi rightController:right];
        
        // 背景图片
        drawer.backgroundImage = [UIImage imageNamed:@"1"];
        // 动画类型
        drawer.drawerControllerStyle = ZJDrawerControllerStyleParallaxSlide;
        // 任何界面都能打开抽屉
        drawer.canOpenDrawerAtAnyPage = YES;
        //...
        self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
        self.window.backgroundColor = [UIColor whiteColor];
        self.window.rootViewController = drawer;
        [self.window makeKeyAndVisible];
        
        return YES;
    }
    
    swipeTableViewCell.gif
    
    - (NSArray<ZJSwipeButton *> *)tableView:(UITableView *)tableView leftSwipeButtonsAtIndexPath:(NSIndexPath *)indexPath {
        ZJSwipeButton *leftBtn = [[ZJSwipeButton alloc] initWithTitle:@"检查1" image:nil onClickHandler:^(UIButton *swipeButton) {
            NSLog(@"点击了检查1: --- %ld", indexPath.row);
            [ZJProgressHUD showStatus:[NSString stringWithFormat:@"点击了检查1: --- %ld", indexPath.row] andAutoHideAfterTime:1];
        }];
        ZJSwipeButton *leftBtn1 = [[ZJSwipeButton alloc] initWithTitle:@"测试2" image:nil onClickHandler:^(UIButton *swipeButton) {
            NSLog(@"点击了测试2: --- %ld", indexPath.row);
            [ZJProgressHUD showStatus:[NSString stringWithFormat:@"点击了测试2: --- %ld", indexPath.row] andAutoHideAfterTime:1];
    
        }];
        return @[leftBtn,leftBtn1, leftBtn2,leftBtn3];
    
    }
    
    navigationController.gif
        UIViewController *vc = [ViewController new];
        ZJNavigationController *navi = [[ZJNavigationController alloc] initWithRootViewController:vc];
        // 开启
        [navi zj_enableFullScreenPop:YES];
    
    qrScanner.gif
        ZJQRScannerView *scanner = [ZJQRScannerView new];
        scanner.frame = self.view.bounds;
        [self.view addSubview:scanner];
        // 开始扫描
        [scanner startScanning];
        // 扫描完成
        [scanner setScannerFinishHandler:^(ZJQRScannerView *scanner, NSString *resultString) {
            // 扫描结束
            NSLog(@"内容是%@", resultString);
        }];
    
    tagView.gif
        // 初始化第一个section数据
        for (int i=0; i<20; i++) {
            ZJTagItem *item = [ZJTagItem new];
            item.name = [NSString stringWithFormat:@"选中--- %d",i];
            [selectedItems addObject:item];
        }
        // 初始化第二个section数据
        for (int i=0; i<40; i++) {
            ZJTagItem *item = [ZJTagItem new];
            item.name = [NSString stringWithFormat:@"未选中--- %d",i];
            [unselectedItems addObject:item];
        }
        // 初始化
        _tagView = [[ZJTagView alloc] initWithSelectedItems:selectedItems unselectedItems:unselectedItems];
    
    lockView.gif
    - (IBAction)deleteBtnOnClick:(id)sender {
        if (![ZJLockViewController isAllreadySetPassword]) {
            NSLog(@"未曾设置过密码或者密码已经被删除");
            return;
        }
        // 初始化
        ZJLockViewController *lock = [[ZJLockViewController alloc] initWithOperationType:ZJLockOperationTypeRemove delegate:self];
        // 宽度
        lock.lockView.pwdBtnSlideLength = 64.f;
        // 线宽
        lock.lockView.lineWidth = 8;
        // 设置不同状态的图片
        [lock.lockView setBtnImage:[UIImage imageNamed:@"normal"] forState:ZJLockButtonStateNormal];
        [lock.lockView setBtnImage:[UIImage imageNamed:@"selected"] forState:ZJLockButtonStateSelected];
        [lock.lockView setBtnImage:[UIImage imageNamed:@"error"] forState:ZJLockButtonStateError];
    
        [self presentViewController:lock animated:YES completion:nil];
        
    
    }
    
    scrollPageView.gif
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // 这个是必要的设置
            automaticallyAdjustsScrollViewInsets = false
            
            var style = SegmentStyle()
            // 缩放文字
            style.scaleTitle = true
            // 颜色渐变
            style.gradualChangeTitleColor = true
            // segment可以滚动
            style.scrollTitle = true
            style.showExtraButton = true
            let childVcs = setChildVcs()
            let titles = childVcs.map { $0.title! }
     
            let scrollPageView = ScrollPageView(frame: CGRect(x: 0, y: 64, width: view.bounds.size.width, height: view.bounds.size.height - 64), segmentStyle: style, titles: titles, childVcs: childVcs, parentViewController: self)
            view.addSubview(scrollPageView)
        }
    
    refreshView.gif
            let normalFooter = NormalAnimator.normalAnimator()
            normalFooter.lastRefreshTimeKey = "exampleFooter1"
            
            tableView.zj_addRefreshHeader(header, refreshHandler: {[weak self] in
                /// 多线程中不要使用 [unowned self]
                /// 注意这里的gcd是为了模拟网络加载的过程, 在实际的使用中, 不需要这段gcd代码, 直接在这里进行网络请求, 在请求完毕后, 调用分类方法, 结束刷新
                dispatch_async(dispatch_get_global_queue(0, 0), {
                    for i in 0...50000 {
                        if i <= 10 {
                            self?.data.append(i)
                            
                        }
                        /// 延时
                        print("加载数据中")
                    }
                    dispatch_async(dispatch_get_main_queue(), {
                        self?.tableView.reloadData()
                        /// 刷新完毕, 停止动画
                        self?.tableView.zj_stopHeaderAnimation()
                        
                    })
                })
                
            })
    

    当你看到这段话的时候, 我心存感激, 感谢您购买正版.这本书是我在电子科技大学就读本科(计算机)的时候完成的. 在开始写作前, 已经做了两年的iOS外包项目开发. 写这本书占据了我大部分的课余时间, 断断续续四个多月. 希望, 它能不辜负你我, 不浪费你我的时间.

    一般大家都是习惯了首先找github上面有没有已经开源的效果可以直接使用, 不过不幸的是, 可能我们搜索的时候关键字都不清楚是什么,可能搜索很久找不到我们想要的. 如果你比较幸运的话, 也许能够找到一些开源控件. 那么如果你找不到自己想要的, 或者已经找到的效果不合适, 需要自己去改动源码, 那么这个过程就很艰辛了. 最终可能就不得不自己动手来实现了.

    希望, 这本书籍能够让你有所收获. 试读章节一

    同时需要说明的:
    书中的demo就是上面提到的, 有很简单的, 也有简单的, 但是没有有难度的. 所以源码我已经全部放在了github上了。网上也能找到这些效果,同时也会有人写类似的实现思路,对很多朋友来说完全不用看这本书籍。所以只是希望给需要学习这些东西的人整理了一系列连贯的实现过程。我原本也是打算直接放在网上给大家阅读,不过免费的东西一般不是很受重视,很多朋友只是浏览罢了,所以成书只是个形式,只是希望阅读的人会重视一些.

    希望有意购买的朋友, 一定要仔细了解书中的内容, 然后判断是否需要阅读, 虽然书籍不贵, 但是不想坑人.目前书籍《iOS自定义控件剖析》已上线。如果有意购买可以在这个网站上。不过请务必确定您已经阅读过之前的书籍内容说明,和试读章节。毕竟定价35偏高,以免对你造成不必要的损失,谢谢!

    如果你购买了书籍, 希望联系到我, 可以通过简书私信给我, 或者联系QQ:854136959 但是请务必备注购买书籍时的账号, 否则可能会被忽略(因为被打扰得很烦了)

    如果只是想看看并不打算学习,那么请直接在其他渠道获取免费的。

    相关文章

      网友评论

      • 在没老之前:大神,你好!关于pickerView那个demo,为啥每次pickerView出来的时候,界面都会闪烁一下,怎么解决啊:stuck_out_tongue_closed_eyes:
      • 叶小合:第二篇引导页demo中,block作为参数,为什么在方法中还要对block参数进行copy呢
        叶小合:@叶小合 谢谢解答
        燕秋Love510:如果block作为参数传递的话,是处于栈内存中的,那样有可能在函数执行完之后这个作为参数的block就释放了,如果copy处理,就会将block从栈中转移到堆中,这样就不会被轻易释放了,大致就这个意思
      • 叶小合:请问有书中的博客可以看嘛
      • 黎巴嫩的冬天:你好,ZJProgressHUD这个demo的源码地址不对,可否重新修改一下?给我一份,谢谢了
      • IAM121:👍
      • 天真烂漫的孩子:书看完了,也跟着写了一些项目,感觉完全不够啊,希望大神多多出书,继续支持~
        ZeroJ:@Singleton_1990 😆个人弄得比较浅显, 还是要在实际工作应用中多积累
      • 天真烂漫的孩子:这个购买后是只能在线看么?
        ZeroJ:@Singleton_1990 朋友, 这个是可以下载几种格式的
      • LazyLoad:在 第一章的 轮播的demo里面 设置 轮播的时间间隔 无效
        我重写了ScrollDuration的 setter方法 解决了问题
        - (void)setScrollDuration:(NSTimeInterval)scrollDuration
        {
        _scrollDuration = scrollDuration;
        [self stopTimer];
        [self startTimer];
        }
        有没有更好的方法?
      • PGOne爱吃饺子:可以给我一个链接么
      • PGOne爱吃饺子:作者的书籍是在哪里卖的,我想支持一下,买一本
      • YungFan:在校生能这样 挺厉害的
      • 施主小欣:膜拜~!
      • 陈永发:非常棒呀,🉐️买本作者的书呀,谢谢作者共享这么多源码。
      • 卟师:大腿,我能转载分享吗?我会标注上作者和出处的
      • 2320e0baa4b0:有swift版本的讲解吗?
      • a637237315f9:多谢分享
      • Marco_Liu:大神你好,你的GitHub已关注,同时也看到了同为大三狗的我们之间的差距,向你看齐~~!
      • 在没老之前:大神,你的HUD的那个demo和无线轮播的重复了。。。
        Coder_T: @在没老之前 在这也能看到你
      • 被帅醒的小吴同志:曾神给你点个赞,也是之前在你的群里,至今还用着你的ZJScrollPageView虽然已被我改的面目全非,说实话这本书如果在一年半以前接触到我估计今天我就不只是这点本事了:joy:不为别的,就为你的技术与这份心必须支持到底!
      • jshto:哈哈偶然看到你写的ZJScrollPageView进来的,大神哈,ZJScrollPageView如果可以自定义设置滚动条长度就完美了~要入手正版支持大大
      • Vincent20481:希望出一下 后台下载 转场动画之类的
      • xipi000:想问下是实体书吗?
      • 許仙:太厉害了 收藏
      • 醉春风:厉害!现在可以买吗?
      • 能量熊:购买了此书,以支持作者的无私奉献,希望再出多多教程
      • draTiger:好强势,学习
      • Supersweet007:太棒了
      • 左先生丶丶:购买途径?内容很实用
        左先生丶丶:@ZeroJ 已经购买,方便留个qq吗,有些问题请假
        ZeroJ:@慢热先生丶Cc 朋友,文章中有链接,不过抱歉,只有电子版的
      • 小冰山口:大神, 请收下我的膝盖!
        ZeroJ:@学豆 :smile:,朋友,谢谢支持
        ZeroJ:@学豆 :smile:,大神不敢当
        小冰山口:@学豆 已在氢弹上支持大神的新书...
      • 伯陽:已收藏,不过话说,你怎么把群解散了啊
        ZeroJ:@伯陽 :grin:上次一次性
        伯陽:@ZeroJ :sob: 你把我好友也删了啊。。。。。
        ZeroJ:@伯陽 :smile:,没什么时间维护
      • 晓晓521:现在有样书了吗?
        ZeroJ:@晓晓521 是的,因为这一篇是比较后面的文章前面有些地方中已经提到了
        晓晓521:如果代码中 ,再多点注释就更好了!更容易看懂!
        ZeroJ:@晓晓521 朋友,目前只有电子版的
      • 凯文Kevin21:书籍电子版怎么卖? 我想要,,,主要想学习一下楼主的自定义控件的一些思路,
        ZeroJ:@七秒小鱼人 朋友,文章最后有购买方式和试读章节,请务必阅读一下
      • 指尖猿:怎么购买 支持一下作者
        ZeroJ:@指尖猿 朋友,文章最后有链接,有试读文章,请务必看看
      • DreamBuddy:大神 你好 赞一个
        ZeroJ:@iOS胖码农 可以去看看,是本不错的书
        ZeroJ:@iOS胖码农 :smile:朋友,不敢不敢,离大神还遥远着呢
        DreamBuddy:@iOS胖码农 &感谢推荐的书 <Objective-C高级编程>
      • 清蒸鱼跃龙门:“记忆最深刻的是,当时好不容易在github上面找到一个圆形进度条, 但是项目中需要的效果不太一样, 需要在进度条的末端加上一个在圆环上滚动的圆点” 我也想知道怎么加这个圆点 :relaxed:
        ZeroJ:@清蒸鱼跃龙门 朋友,进度条的章节写到了,或者github上下载源码有这个小功能
      • ilovemdcat99:书名是是什么
        ZeroJ:@ilovemdcat99 :smiley: iOS自定义控件剖析
      • 1df4431eb0ee:正需要,已购买并打赏一杯:coffee:️。顺便刷存在感,对了,哪有十块钱一杯的:coffee::flushed:
        ZeroJ:@arliang725 哈哈,多谢朋友的咖啡
        ZeroJ:@arliang725 :smiley:朋友,谢谢你的支持
        1df4431eb0ee:@arliang725 我的咖啡变问号了:pensive:
      • 0x00chen:写得很棒,感谢分享 :smile:
      • 6605eae1686f:请问有实体书吗
        ZeroJ:@征天紫龙 你好,朋友,目前还没有实体书
      • 2847cd937173:好, 谢谢, 一定要 买
        ZeroJ:@jasnia 多谢支持
      • 上冬十二:顶起来,加油 :smiley:
        上冬十二:@ZeroJ :smile:
        ZeroJ:@Pnyg_回眸 :smile:多谢支持
      • 专心致志的程序员:写的不错,对于刚入门的很有帮助,
        ZeroJ:@回眸又是微笑 对的,只能对一些经验不是很丰富的朋友有用
      • jswift:一直看过你的博客, 已购买两本送人, 谢谢
        ZeroJ:@jswift :smile:多谢支持,:flushed:送人不是买一本就好么
      • 73565c8c3227:牛逼 很实用 参考价值很高 赞
        ZeroJ:@Akulio :smile:,实用性有,不过都是比较容易实现的
      • 夜的v:好书,感谢开源。点赞。
        ZeroJ:@夜的v :smile:参考参考
      • 莜12138:好书好书 什么时候出 一定要买一本
        ZeroJ:@莜12138 客气
        莜12138:@ZeroJ 谢谢
        ZeroJ:@莜12138 谢谢,很快就能获取到了
      • d9d860c2a36d:iOS开发群:446310206
      • 游泳帽:可以放到网上卖电子版吧 之前在网上买的onevcat的swifter一百个必备tip 更新会发邮件 挺方便的
        游泳帽:@阳光下的微笑199109 在 SelfStore上, 现在已经停止购买了 王巍那本放到了 ObjC 中国的网站 可以购买
        ngugg: @游泳帽 在那个网上?😛
        ZeroJ:@游泳帽 嗯是的,纸质版比较麻烦,而且可能水平也不够
      • windorz:感谢作者分享 。作为iOS菜鸟真的还蛮需要的。
        ZeroJ:@windorz 多数是可以直接使用的
      • 夏天的风_song:很是喜欢 :blush:
        ZeroJ:@夏天的风_song 谢谢
      • 刘望舒:我也在写书,可以帮你联系电子工业出版社博文视点的编辑,能不能出得看他们的审核
        ZeroJ:@刘望舒 谢谢,准备弄成电子版的,方便传阅
      • carpond:试读章节不错,封装的不错,细带书籍
      • fd320d65dbd8:好赞!
        ZeroJ:@Jonhory :smiley:谢谢
      • Thebloodelves:不错不错,你这么牛逼不加我的群我会觉得可惜的,你回复我就表示愿意加我的群咯,然后我给你号码:smile:
      • 一抹淡季:哇塞,好棒呀,支持支持
        ZeroJ:@一抹淡季 :smile:多谢多谢
      • 东方不败撸大师: 感谢分享非常精彩!! 现在可以购买您的书本了吗?叫什么书名 告知一下。。。。。
        ZeroJ:@东方不败撸大师 客气
        东方不败撸大师:@ZeroJ 感谢您的分享。。。
        ZeroJ:@东方不败撸大师 朋友,你好,书籍暂定为《iOS自定义控件剖析》,很快就能获取到了
      • 彭小先生:默默拿走 谢谢
        ZeroJ:@林都房 :grin: 客气
      • 奇二世界:能加qq吗?
        奇二世界:@ZeroJ 是惧念吗
        ZeroJ:@奇二世界 可以加597769272
      • hou_8:楼主 这是还在上学嘛
        hou_8:@ZeroJ 厉害了 我的哥 大三的时候 整天还在睡觉呢
        ZeroJ:@hou_8 :grin: 嗯是的, 还在大三
      • wingching:写的好啊 都是实用的干货 对能力有提高 希望能出书 值得入手 到时烦请给书名链接哦
        ZeroJ:@wingching 朋友,链接中应该是能看到全部目录的,书籍是电子书,我寻思着应该没有多少人购买,所以定价偏高,希望真正想读的人买了能珍惜点
        wingching:@ZeroJ 我在上面链接看不到 你的书全部目录啊, 加上你这个是电子书么 支付的时候没要填详细地址
        ZeroJ:@wingching 谢谢, 其实都是些比较容易实现的效果, 希望你好好评估是否需要阅读它, 不然可能浪费时间呢. 这里有一篇试读文章. http://www.jianshu.com/p/7fca7b76341d
      • sqatm:问下 书呢?在哪买?叫啥?有电子版的不?多少钱?
        ZeroJ:@sqatm :grin: 朋友, 这本书已经完成了 但是还没有开始卖, 电子版的, 我尽快吧
      • Doliant_H:大赞,感谢楼主无私分享~
      • 张智杰:学长好棒啊~~~~
        ZeroJ:@张智杰 :grin: 没有没有, 都是些比较容易实现的
      • _皮皮_:膜拜大神
        ZeroJ:@_皮皮_ 不敢不敢, 离大神还很遥远, 都是些比较容易实现的
      • 林夕不昔:大赞,第一次打赏,嘿嘿!请问有没有内存管理,性能优化方面的资料,自学应该从哪方面入手呢,完全没有头绪
        ZeroJ:@张小威 恕我直言,一个人做的话,想要深入学习的话很慢
        林夕不昔:@ZeroJ 恩恩,谢谢,我做了快一年的iOS开发了,工作中都是自己一个人做,有一定基础,但很多时候功能实现就行了,关于内存管理,如何开发高性能的应用就不知道怎么做了
        ZeroJ:@张小威 谢谢. 朋友, 关于内存管理和性能优化的话. 推荐一本<Objective-C高级编程>, 自学的话还是先学习swift或者Objective-C的语法和一些系统库的基础知识 (网上或者书店能找到很多这种书籍), 然后自己多看看别人的博客, 多总结积累就能完成一些基本的开发了. 不过如果不是科班出身, 还是建议自己能想办法系统的学习一系列的东西
      • 胖子程:真的很棒!你能总结出来这么多,说明真的是用心了,加油!(但是,说实话你写的这些不但网上都有资源,而且不是很难的技术,所以个人觉得不是太适合作为图书出版。一个开源的环境才能让大家进步更快,这种一点小总结都要作为图书出版,那.....)完全没有贬低你的意思哈,你写的很用心,但是确实不适合。
        ZeroJ:@胖子程 :smile:,不过说来现在写书的感觉就是公益活动,其实就算单独为了卖钱也卖不了什么,盗版到处都能下载。所以只能算是形式,让人觉得可能有必要仔细读读:smile:
        胖子程:@ZeroJ 恩恩,是的,现在确实有这个现象,免费的都不珍惜,哈哈。可以的,顶你! :blush:
        ZeroJ:@胖子程 嗯是的,我明白你说的意思。不过这些简单的东西的源码我已经全部放在了github上了。网上也能找到这些效果,同时也会有人写类似的实现思路,对很多朋友来说完全不用看这本书籍。所以只是希望给需要学习这些东西的人整理了一系列连冠的实现过程。我原本也是打算直接放在网上给大家阅读,不过免费的东西一般不是很受重视,很多朋友只是浏览罢了,所以成书只是个形式,只是希望阅读的人会重视一些。:smile:
      • 开心就好123:书呢?
        ZeroJ:@开心就好123 朋友书完成了, 但是还没上架, 我尽快吧, 书里的内容比较简单, 这里有试读文章 http://www.jianshu.com/p/7fca7b76341d, 可以参考下
      • 凡尘一笑:收藏了
      • WillkYang:问题来了,你是201几级的 :smiley:
        ZeroJ:@yate1996 14级, 目前本科大三
      • 垃圾___垃圾:建议电子版,,毕竟可以更新。。。出纸质版的书应该比较麻烦的。。。。。。
        ZeroJ:@驿路梨花开 嗯好的, 谢谢提示, 这种水平的书也不敢自以为是的弄成纸质版的骗钱
      • 卡农forever_love:精品噶。。Mark起。。 :+1:
        ZeroJ:@卡农forever_love 😆, 谢谢, 都是些比较容易实现的
      • Fifi_Bao:牛人:+1:
        ZeroJ:@Fifi_Bao :grin: 不敢不敢呢, 都是些比较容易实现的
      • 奔奔奔跑:可以的,封装复用,这个东西好
        ZeroJ:@纯属玩笑 供参考参考
      • 01b85ef5c24a:试读章节 最好选一难一易
        ZeroJ:@colaios :grin: 好的, 不过里面都比较简单, 没有有难度的, 所以并不适合很多人阅读, 不然都是浪费时间了
      • dongwenbo:不错不错,正需要
      • Rickie_Lambert:感谢楼主 无私的分享, 为后人的开发之路铺设了一条宽敞大道 :clap:
        ZeroJ:@Mr_Rain :grin: 不敢不敢, 都是些比较容易实现的
      • 冰雪童话:活该优秀一辈子
        ZeroJ:@冰雪童话 :smile:说笑了
      • 磊落不凡:好,谢谢
      • 回南路宋三万:顶起,有样书了吗?现在急需,刚入门不久
        回南路宋三万:@ZeroJ 嗯嗯,技术与德行兼备的大牛,一万个赞:+1:
        ZeroJ:@贝塔developer 书籍目前是写作完成了, 简单的排版也完成了, 不过还没联系出版的平台, 等我发几节试读文章, 到时候看看吧, 万一不适合呢, 不想坑人
      • 7a3d3914a57d:厉害:+1:
        ZeroJ:@Love小布丁1314 不敢不敢, 都是些比较容易实现的效果
      • 8df99919a8f7:挺好,最好整个PDF版
        8df99919a8f7:@ZeroJ :heart_eyes:加油
        ZeroJ:@大湖鱼儿多 :grin: 嗯是的, PDF版已经完成了, 等我发几节试读文章, 然后联系上出版平台
      • 苜蓿鬼仙:很实用的一些 demo
        ZeroJ:@苜蓿鬼仙 嗯是的, 所以很多朋友只需要源码就好了 , 书籍内容比较简单, 不建议有能力自己实现的朋友购买
      • 飞龙在天8:还不知道书名是什么。。。
        ZeroJ:@飞龙在天8 没有没有,应该最近几天就能获取到了
        飞龙在天8:哦哦,那最近还是买不了了,最快也得年后了吧。鼓励鼓励!
        ZeroJ:@飞龙在天8 :grin: 内容是完成了, 但是书名不敢随便写呀, 等联系上出版平台再决定吧
      • LovelyYilia:好厉害
        ZeroJ:@LovelyYilia 不敢不敢, 都是些比较容易实现的效果
      • 九思行:好人一生平安
        丶漫步:安慰既视感
        ZeroJ:@DreamYang 😀😀对对
      • iYeso:写的朴实 简洁 实用 大赞!
        ZeroJ:@greedyDoor 😆, 谢谢, 书籍的内容很简单的, 只是提供给觉得需要的人看的
      • xx_cc:厉害,我也一直想写这样的文章,一直没有动手,膜拜。
        ZeroJ:@xx_cc 不敢不敢,都是些比较容易实现的效果
      • macfai:曾神,一男,大赞,顶起,学习中
        macfai:@ZeroJ 一男,见笑了,我现在还是要学习一些基础,一直感觉如果自己封装的话思路不是那么顺畅,基础不扎实
        ZeroJ:@macfai :smile:,对你来说就偏简单,反正也还没去找出版的地方,直接送给你看呗
      • 夏木友橙:厉害了,好多都是需要的。
        ZeroJ:@一粒灬尘埃 :smile:实现都是比较简单的,复杂的不适合写进书
      • GRIM:沙发,果断收藏
        GRIM:@ZeroJ 书写了多少了?
        ZeroJ:@GRIM 好呀,不过不知道发其中的那一节作为试读章节

      本文标题:(iOS)希望这本《iOS自定义控件剖析》书籍能够让学习中的你有

      本文链接:https://www.haomeiwen.com/subject/zhumuttx.html