• iOS开发常见BUG和一些小技巧(ps:耐心看完,很实用)



    【385】【scrollView不接受点击事件,是因为事件传递失败】

    //

    // MyScrollView.m

    // Created by beyond on 15/6/6.

    // Copyright (c) 2015年 beyond.com All rights reserved.

    // 不一定要用继承,可以使用分类

    #import MyScrollView.h

    #import CoView.h

    @implementation MyScrollView

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

    if(!self.dragging)

    {

    UITouch *touch = [touches anyObject];

    CGPoint loc = [touch locationInView:self];

    // x y转成coView中的坐标

    CGFloat x = loc.x - 10;

    CoView *coView = (CoView *)[self viewWithTag:5267];

    CGFloat y = loc.y - coView.y;

    CGPoint newLoc = [coView convertPoint:loc fromView:self];

    // 经过验证:x == newLoc.x y == newLoc.y

    x = newLoc.x;

    y = newLoc.y;

    // 现在就是通过point 算出 row,col,进而的推算出i

    int col = x/(kBtnWH+kBtnMarginH);

    int row = y/(kBtnWH+kBtnMarginV);

    int i = row*kBtnColumnNum + col;

    [[self nextResponder] touchesBegan:touches withEvent:event];

    // 注意,coView处理的时候,i越界的情况要处理;i从0开始

    DLog(@--点了第%d个---,i);

    [coView btnTouched:i];

    }

    [super touchesBegan:touches withEvent:event];

    //NSLog(@MyScrollView touch Began);

    }

    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

    {

    if(!self.dragging)

    {

    [[self nextResponder] touchesEnded:touches withEvent:event];

    }

    [super touchesEnded:touches withEvent:event];

    }

    @end

    【382】【带暂停和继续的NSTimer】

    #import

    @interface NSTimer (Pause)

    @property (nonatomic, strong, readwrite) NSString *state;

    -(void)pause;

    -(void)resume;

    @end

    ///////////////////////////////////////////////////////////////////////////

    #import NSTimer+Pause.h

    #import

    static void *state = (void *)@state;

    @implementation NSTimer (Pause)

    -(void)pause

    {

    if (![self isValid]) {

    return ;

    }

    [self setFireDate:[NSDate distantFuture]]; //如果给我一个期限,我希望是4001-01-01 00:00:00 +0000

    }

    -(void)resume

    {

    if (![self isValid]) {

    return ;

    }

    [self setFireDate:[NSDate date]];

    }

    - (NSString *)state

    {

    return objc_getAssociatedObject(self, state);

    }

    - (void)setState:(NSString *)s

    {

    objc_setAssociatedObject(self, state, s, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

    }

    @end

    【381】【给分类添加属性】

    // Declaration

    @interface MyObject (ExtendedProperties)

    @property (nonatomic, strong, readwrite) id myCustomProperty;

    @end Implementation

    static void * MyObjectMyCustomPorpertyKey = (void *)@MyObjectMyCustomPorpertyKey;

    @implementation MyObject (ExtendedProperties)

    - (id)myCustomProperty

    {

    return objc_getAssociatedObject(self, MyObjectMyCustomPorpertyKey);

    }

    - (void)setMyCustomProperty:(id)myCustomProperty

    {

    objc_setAssociatedObject(self, MyObjectMyCustomPorpertyKey, myCustomProperty, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

    }

    @end

    【367】【评论提示后返回】

    [SVProgressHUD showSuccessWithStatus:@提交成功];

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

    [blockSelf.navigationController popViewControllerAnimated:YES];

    });

    【365】【每一组的最新记录:分组之前 先排序】

    select max(FTime),* FROM DynamicInfoTable WHERE FUID = 'd441e1d7-2362-4c7e-9486-37fd834b3232' group by FOrgID,FType order by max(FTime) DESC

    【363】【label文字左边距】

    UIView *leftview = [[UIView alloc] initWithFrame:frame];

    textField.leftViewMode = UITextFieldViewModeAlways;

    textField.leftView = leftview; //imageView

    【362】【返回之前,必须退出键盘】【#pragma mark - 返回提示 // 返回,由于是发布页面,所以要检查 提示 防止误操作 - (void)back:(id)sender { BOOL hasSomething = [self formHasSomething]; if (hasSomething) { // 提示 // 发送请求,删除 UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@温馨提示 message:@您确定要放弃发布并返回吗? delegate:nil cancelButtonTitle:@取消 otherButtonTitles:@确定, nil]; alertView.confirmBlock = ^(){ // 调用父类的返回 [super back:sender]; }; [alertView show]; return; }else{ [self.view endEditing:YES]; [super back:sender]; } }】

    【358】【3G4G自动下载图片】

    #import UIImageView+Download.h

    // 异步下载图片

    #import UIImageView+WebCache.h

    #import KLNetworkStatus.h

    #import KLTools.h

    @implementation UIImageView (Download)

    - (void)downloadImgWithUrlString:(NSString *)urlString placeHolderImgName:(NSString *)placeHolderImgName

    {

    if (!(urlString.length > 0)) {

    //没有图片,直接使用默认图

    self.image = [UIImage imageNamed:placeHolderImgName];

    return;

    }

    NSURL *url = [NSURL URLWithString:urlString];

    // 1.先从缓存中取,如果缓存中有:直接设置

    SDWebImageManager *manager = [SDWebImageManager sharedManager];

    BOOL isImgAlreadyExists = [manager cachedImageExistsForURL:url];

    if (isImgAlreadyExists) {

    UIImage *image = [manager.imageCache imageFromDiskCacheForKey:urlString];

    [self setImage:image];

    return;

    }

    // 2.如果缓存中没有,如果是WIFI,下载

    BOOL isWifi = [[KLNetworkStatus sharedKLNetworkStatus] isReachableViaWifi];

    if (isWifi) {

    [self sd_setImageWithURL:url placeholderImage:[UIImage imageNamed:placeHolderImgName]];

    return;

    }

    // 3.如果是3G/4G,则要再进行判断用户是否开启了 自动下载

    BOOL isWWAN = [[KLNetworkStatus sharedKLNetworkStatus] isReachableViaWWAN];

    if (isWWAN) {

    BOOL isAllowDownload = [KLTools isNetworkDownloadSet];

    if (isAllowDownload) {

    [self sd_setImageWithURL:url placeholderImage:[UIImage imageNamed:placeHolderImgName]];

    return;

    }

    }

    }

    @end

    【348】【判断是否安装weixin】

    [WXApi isWXAppInstalled]方法无效

    使用下面这个

    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@weixin://]])

    {

    NSLog(@OK weixin://);

    }

    【347】【导航标题】【self.navigationItem.title = @发布;】

    【346】【xib中的cell无故多出一个半透明灰灰的40高、300宽的label,通过po打印,发现是两个label,猜测是contentLabel和detailLabel】

    产生原因:是由于在xib选择了一次cell的accessory为detail,结果 在xib代码中 添加了两个label,

    因此,即使 再次将accessory选择为no,那两个label依然在xib代码中。。。。

    (lldb) po self

    >

    (lldb) po self.contentView

    ; layer = >

    (lldb) po [self.contentView subviews]

    <__NSArrayM 0x6ffb850>(

    >,

    >,

    >,

    >,

    >,

    >,

    >

    )

    【345】【正则,表情匹配{:001:}对应的是@{:ddd:},注意括号都要转义】

    @{:ddd:}反解析 表情文字

    +(NSString *) FContentPrettyFaceText:(NSString *)faceText

    {

    NSString *str = faceText;

    NSString *pattern = @{:ddd:};

    NSError *error = NULL;

    //定义正则表达式

    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:&error];

    //使用正则表达式匹配字符

    NSArray *arr = [regex matchesInString:str options:0 range:NSMakeRange(0, [str length])];

    NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@facesDic.plist ofType:nil]];

    if (arr.count != 0)

    {

    for (long i = arr.count - 1; i >= 0; i--) {

    NSTextCheckingResult *result = arr[i];

    NSRange range = [result range];

    // 开始位置比如:9

    int loc = range.location;

    // 长度固定是 7

    int len = range.length;

    // {:067:}

    NSString *subStr = [str substringWithRange:range];

    NSString *key = [subStr substringWithRange:NSMakeRange(2, 3)];

    // key:067

    NSString *value = [dict objectForKey:key];

    // [爱心]

    // 首

    NSString *head = [str substringToIndex:loc];

    // 尾

    NSString *tail = [str substringFromIndex:loc + len];

    str = [NSString stringWithFormat:@%@%@%@,head,value,tail];

    }

    }

    return str;

    }

    【343】【奇怪的bug】

    问题描述:

    1、tableView是通过IB,并且有自动布局;

    2、headView是通过代码创建的

    3、给tableView加headView,没有问题

    4、给tableView加footerView,当用代码创建时,也没有问题

    5、但是:当footerView是用自动布局时,tableView首次展示时,footView高度为0;

    但是,当jump到一个控制器,并且再次返回时,tableView再次显示,此时footView高度正常了。。。

    问题原因:

    猜测是:tableView的自动布局影响的

    解决方法:

    当前 想到的是:线程延迟几秒再给tableView设置footView

    self.tableView.tableHeaderView = self.headView;

    _footerView = [RowView RowView];

    // 这里加个延迟,不然会高度为0,应该是自动布局导致的问题

    kWeakSelf

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.05 * NSEC_PER_SEC)),dispatch_get_main_queue(), ^{

    kStrongSelf

    strongSelf.tableView.tableFooterView = _footerView;

    [UIView animateWithDuration:5 animations:^{

    [strongSelf.view layoutIfNeeded];

    [strongSelf.tableView layoutIfNeeded];

    }];

    });

    【342】【只要约束改变后,就要手动刷新对应的view】

    _topView.bigImgHeightConstraint.constant = 0;

    [UIView animateWithDuration:0.3 animations:^{

    [self.view layoutIfNeeded];

    [_topView layoutIfNeeded];

    }];

    【340】【IB控件用weak,String用copy,delegate用weak,block用copy,对象类型用Strong,基本类型用assign】

    @property (nonatomic,weak) IBOutlet UILabel *label;

    - (IBAction)xxxBtnClicked:(UIButton *)sender;

    【335】【label图文混排CBEmotionView】【 使用core text 和 core graphics 实现的文字与表情图片的并排绘制】

    【334】【Localizable.strings】

    //

    // Localizable.strings

    本地资源文件

    //

    // Created by beyond on 15/3/19.

    // Copyright (c) 2015年 beyond. All rights reserved.

    //

    appName=XXX;

    login_now=立即登录;

    vip_showmsg=请联系您孩子的班主任开通VIP服务;

    NSString *str = NSLocalizedString(@vip_showmsg, nil);

    UIActionSheet *sheet = [[UIActionSheet alloc]initWithTitle:str delegate:self cancelButtonTitle:@关闭 destructiveButtonTitle:@购买VIP otherButtonTitles:@联系客服, nil];

    [sheet showInView:self.view];

    【333】【禁用单个页面手势滑动返回功能】

    在有的时候,我们不需要手势返回功能,那么可以在页面中添加以下代码:

    - (void)viewDidAppear:(BOOL)animated

    {

    [super viewDidAppear:animated];

    // 禁用 iOS7 返回手势

    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {

    self.navigationController.interactivePopGestureRecognizer.enabled = NO;

    }

    }

    - (void)viewWillDisappear:(BOOL)animated

    {

    [super viewWillDisappear:animated];

    // 开启

    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {

    self.navigationController.interactivePopGestureRecognizer.enabled = YES;

    }

    }

    #define KLNavigationBarHidden [self.navigationController setNavigationBarHidden:YES animated:YES];

    #define KLNavigationBarShow [self.navigationController setNavigationBarHidden:NO animated:YES];

    【332】【反斜杠】

    在吗 NSString 如何表示反斜杠呀

    NSString *path = @main;

    打一个错误, 和“挨一起就出错,打两个 NSString *path = @main;可以,但是后面

    [path appendString @d盘];以后,

    实际的path内容为maind盘 怎么弄一个单反斜杠呀??

    NSString *str = [NSString stringWithFormat:@%@\%@,@main,@d盘];

    NSLog(@str:%@,str);

    我发现了,这是个显示的问题,在Debuger Console里可以正常显示,在调试中却显示成两个斜杠,转意字符应该是好使的,即NSString中,,就是 一个 的转意字符,和c的和c++的一样,只是调试时显示的值有bug罢了。

    【331】【data-->string-->OC对象】

    (lldb) po data

    <7b225374 61747573 436f6465 223a3530 302c2245 72726f72 4d657373 61676522 3a22e794 a8e688b7 e4b88de5 ad98e59c a8e68896 e5af86e7 a081e994 99e8afaf efbc8122 2c22436f 6e74656e 74223a6e 756c6c7d>

    (lldb) po responseString

    {StatusCode:500,ErrorMessage:用户不存在或密码错误!,Content:null}

    2015-05-21 14:26:31.952 JZH[161:60b] __70-[NetRequest initWithAction:userId:password:otherParam:completeBlock:]_block_invoke [Line 209] responseObject ==== {

    Content = ;

    ErrorMessage = U7528U6237U4e0dU5b58U5728U6216U5bc6U7801U9519U8befUff01;

    StatusCode = 500;

    }

    【330】【label中显示表情】【查看原文】

    【327】【金额用NSNumber接收,必须strong引用 否则 内存释放,崩掉】

    //金额

    @property (nonatomic,strong) NSNumber *orderPrice;

    double currentPrice = [model.FCurrentPrice doubleValue];

    _topView.currentLabel.text = [NSString stringWithFormat:@¥%.02lf,currentPrice];

    【326】【xcode6建分类】【左上角file菜单---》new File---->Objective-c File---->Category】

    【325】【通知】

    - (void)xxxNoti:(NSNotification *)noti

    {

    //获取键盘的高度

    NSDictionary *dict = [noti userInfo];

    }

    - (void)dealloc

    {

    [[NSNotificationCenter defaultCenter]removeObserver:self];

    }

    // 监听支付成功

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(paySuccess) name:@notificationCenter_paySuccess object:nil];

    [[NSNotificationCenter defaultCenter] postNotificationName:@notificationCenter_paySuccess object:nil];

    【324】【webview死活不执行js代码】

    webview加载本地html需要时间,同时,通过id向服务器获取详情也需要时间,因此:很可能当服务器已经获取到detail信息时,本地的html尚未加载完毕,故出现上述情况

    【323】【UIAlertView+Block】

    #import

    typedef void (^UIAlertViewBlock)(UIAlertView *alertView, NSInteger buttonIndex);

    typedef void (^ConfirmBlock)(void);

    @interface UIAlertView(Block)

    @property (nonatomic,copy)ConfirmBlock confirmBlock;

    @property (nonatomic,copy)UIAlertViewBlock clickBlock;

    // 必须手动用运行时绑定方法

    - (void)setConfirmBlock:(ConfirmBlock)confirmBlock;

    - (ConfirmBlock)confirmBlock;

    - (void)setClickBlock:(UIAlertViewBlock)clickBlock;

    - (UIAlertViewBlock)clickBlock;

    @end====================

    #import UIAlertView+Block.h

    #import

    @implementation UIAlertView(Block) 必须手动用运行时绑定方法

    - (void)setConfirmBlock:(ConfirmBlock)confirmBlock

    {

    objc_setAssociatedObject(self, @selector(confirmBlock), confirmBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);

    if (confirmBlock == NULL) {

    self.delegate = nil;

    }

    else {

    self.delegate = self;

    }

    }

    - (ConfirmBlock)confirmBlock

    {

    return objc_getAssociatedObject(self, @selector(confirmBlock));

    }

    必须手动用运行时绑定方法

    - (void)setClickBlock:(UIAlertViewBlock)clickBlock

    {

    objc_setAssociatedObject(self, @selector(clickBlock), clickBlock, OBJC_ASSOCIATION_COPY_NONATOMIC);

    if (clickBlock == NULL) {

    self.delegate = nil;

    }

    else {

    self.delegate = self;

    }

    }

    - (UIAlertViewBlock)clickBlock

    {

    return objc_getAssociatedObject(self, @selector(clickBlock));

    }

    #pragma mark - UIAlertViewDelegate

    - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

    {

    if (buttonIndex == 1) {

    // 确定

    if (self.confirmBlock) {

    // self.confirmBlock(self, buttonIndex);

    self.confirmBlock();

    }

    } else {

    // 取消或其他

    }

    if (self.clickBlock) {

    self.clickBlock(self, buttonIndex);

    }

    }

    @end====================

    // 发送请求,删除

    UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@温馨提示 message:@您确定要放弃发布并返回吗? delegate:nil cancelButtonTitle:@取消 otherButtonTitles:@确定, nil];

    alertView.confirmBlock = ^(){

    // 调用父类的返回

    [super doBack:sender];

    };

    [alertView show];

    【322】【按钮,左图 右文字】

    #import OperationBtn.h

    #define kMargin 5

    @implementation OperationBtn

    - (void)setHighlighted:(BOOL)highlighted

    {

    // do nothing 就是取消默认的高亮状态

    }

    - (CGRect)imageRectForContentRect:(CGRect)contentRect

    {

    // 图片等宽高(15,整个按钮是25,图片左上边距全是5)

    CGFloat wh = contentRect.size.height - kMargin - kMargin ;

    CGRect rect = CGRectMake(kMargin, kMargin, wh, wh);

    return rect;

    }

    - (CGRect)titleRectForContentRect:(CGRect)contentRect

    {

    // 文字居右 (图片15*15)

    CGFloat wh = contentRect.size.height - kMargin - kMargin;

    CGFloat x = kMargin + 15 + 3;

    CGFloat y = kMargin + 3;

    CGRect rect = CGRectMake(x, kMargin,contentRect.size.width - x, wh);

    return rect;

    }

    - (void) setEnabled:(BOOL)enabled

    {

    DLog(@setEnabled方法:%d,enabled );

    [super setEnabled:enabled];

    }

    @end

    【321】【No matching provisioning profiles found】

    问题:Your build settings specify a provisioning profile with the UUID “dedebf56-8f41-4af9-aeb8-5ec59fe02fedbeyond”, however, no such provisioning profile was found. Xcode can resolve this issue by downloading a new provisioning profile from the Member Center.

    解决方法:

    targets---build settings---- code signing----provisioning profile----debug

    【320】【自动布局按钮排列】【先全部与父类对齐,然后设置一下乘积因子】【查看原文】

    【315】【webview执行js函数注意事项】

    url has prefix 判断时,要注意ios统一加http://并且注意大小写哦~~~

    字符串参数要用单引号

    数字不用

    true用数字1

    并且jsonString必须使用NSJSONReadingMutableLeaves,

    不能使用pretty风格,如下所示:

    NSData *data = [NSJSONSerialization dataWithJSONObject:bigDict options:NSJSONReadingMutableLeaves error:nil];

    NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    【314】【奇怪的问题】【在cell的xib文件中 添加了一个控件如label,并且IBOutlet连线,但是:运行的时候该label却没有初始化显示为nil】

    【312】【JSBadgeView 是一个可定制的在视图上显示徽章的 iOS 组件】

    【311】【iphone6截屏750 X 1334】

    【310】【框架请求失败,提示405不支持POST,只allow GET】

    位于类:AFHTTPRequestOperation.m

    位于方法:

    - (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success

    failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;

    具体代码:

    id responseObject = self.responseObject;

    if (self.error) {

    if (failure) {

    dispatch_group_async(self.completionGroup ?: http_request_operation_completion_group(), self.completionQueue ?: dispatch_get_main_queue(), ^{

    failure(self, self.error);

    });

    }

    } else {

    if (success) {

    dispatch_group_async(self.completionGroup ?: http_request_operation_completion_group(), self.completionQueue ?: dispatch_get_main_queue(), ^{

    success(self, responseObject);

    });

    }

    }

    (lldb) po self.response

    { URL: http://192.168.1.124:555/api/System/GetUserIdentityInfo } { status code: 405, headers {

    Allow = GET;

    Cache-Control = no-cache;

    Content-Length = 73;

    Content-Type = application/json; charset=utf-8;

    Date = Mon, 11 May 2015 06:22:47 GMT;

    Expires = -1;

    Pragma = no-cache;

    Server = Microsoft-IIS/7.5;

    X-AspNet-Version = 4.0.30319;

    X-Powered-By = ASP.NET;

    } }

    (lldb) po self.responseObject

    {

    Message = The requested resource does not support http method 'POST'.;

    }

    【309】【关于xcode自己revoke(吊销)certificate(证书)的问题】

    原因:新target运行项目的时候,提示找不到描述文件;xcode提议 自动fix issue

    描述:这时候,xcode会 revoke(吊销)原来的certificate(证书),因此,与原来证书相关联的描述文件,全部会失效;

    解决方法:正确的做法是:从团队其他人员拷贝描述文件到本机,双击导入;在xcode项目配置的设置中 选择刚才导入的描述文件,进而选择code sign identity

    【308】【方形图片变圆】

    70 * 70的话,圆角只要设置成half即可,即:35

    // 从xib中加载 实例化一个SynClassCell对象

    + (ParentDetailTopView *)ParentDetailTopView

    {

    // mainBundel加载xib,扩展名不用写.xib

    NSArray *arrayXibObjects = [[NSBundle mainBundle] loadNibNamed:@ParentDetailTopView owner:nil options:nil];

    ParentDetailTopView *topView = [arrayXibObjects firstObject];

    topView.headImgView.layer.masksToBounds = YES;

    topView.headImgView.layer.cornerRadius = 35.f;

    return topView;

    }

    【305】【scrollView滚动范围】【// 重置contentView的滚动范围必须大于其bounds的高,才能滚动】

    【304】【cell侧滑ime删除】

    1.dataSource的方法:

    - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath

    此方法就是给一个空的实现滑动也会出现删除按钮!!

    2. 必须先删除数据源

    [blockSelf.arrayData removeObjectAtIndex:indexPath.row];

    // 再删除view

    [blockSelf.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];

    [blockSelf.tableView reloadData];

    【301】【弹出动画】

    注意在viewDidAppear调用

    - (void)addKeyAnimation

    {

    CAKeyframeAnimation * animation;

    animation = [CAKeyframeAnimation animationWithKeyPath:@transform];

    animation.duration = 0.5;

    animation.delegate = self;

    animation.removedOnCompletion = YES;

    animation.fillMode = kCAFillModeForwards;

    NSMutableArray *values = [NSMutableArray array];

    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)]];

    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];

    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.9, 0.9, 0.9)]];

    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0, 1.0, 1.0)]];

    animation.values = values;

    [_contentView.layer addAnimation:animation forKey:nil];

    }

    【299】【ineligible devices】

    iphone 6 with 8.3系统,连接到xcode 6.01 时,

    提示:ineligible devices

    原因:xcode版本太低

    解决办法:

    换成xcode 6.1 即可

    ==============

    Xcode 6.1 update. The 6.0.1 does't support iOS 8.1.

    【查看原文】

    【298】【二次包装过程】

    将一个字典,包装成一个大的大典,再转成jsonString

    // 二次包装过程

    NSArray *modelArr = [MarkModel objectArrayWithKeyValuesArray:dataArr];

    MarkBigModel *bigModel = [[MarkBigModel alloc]init];

    bigModel.FScore = 5;

    NSArray *dictArray = [MarkModel keyValuesArrayWithObjectArray:modelArr];

    bigModel.MciMcBusiSiteRemarkItems = dictArray;

    bigModel.RemarkCount = modelArr.count;

    // 模型 转 字典,之后就可以用字典 转 jsonString

    NSDictionary *bigDict = bigModel.keyValues;

    另1种是 通过NSJSONSerialization 转成Data,再从Data 转成jSON string,会有反斜线

    NSData *data = [NSJSONSerialization dataWithJSONObject:bigDict options:NSJSONReadingMutableLeaves error:nil];

    NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    【297】【OC的字典转成jsonString】

    // 重要说明:content此时已经从json串 转成了OC的字典 1种是 通过JSONKIT,可将字典转成json字符串;

    // self.jsonString = [(id)content JSONString]; 另1种是 通过NSJSONSerialization 转成Data,再从Data 转成jSON string

    NSData *data = [NSJSONSerialization dataWithJSONObject:content options:NSJSONWritingPrettyPrinted error:nil];

    self.jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

    【296】【appdelegate中的支付回调1】

    // pay ---- 3

    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

    {

    [Pingpp handleOpenURL:url withCompletion:nil];

    [[NSNotificationCenter defaultCenter]postNotificationName:@notificationCenter_userPayOrNot object:nil];

    return YES;

    (lldb) po url

    jzh://pingpp?result=success

    (lldb) po sourceApplication

    com.apple.mobilesafari

    (lldb) po annotation

    nil

    (lldb)

    }

    【293】【代码改约束】

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

    // // 当事件触发时,改变其constant值,然后调用约束所在的对象的 layoutIfNeeded方法,固定的~ 例如:

    // _topView.collectionViewHeightConstraint.constant = 50;

    // // self.leftMarginConstraint.constant = 100;

    // // self.widthConstraint.constant = 200;

    // [UIView animateWithDuration:2.0 animations:^{

    // [self.view layoutIfNeeded];

    // [_topView layoutIfNeeded];

    // }];

    });

    【292】【cell图片在xib中aspect fit无效,只能用代码调整】

    self.img.contentMode = UIViewContentModeScaleAspectFill;

    self.img.clipsToBounds = YES;

    【291】【cell分割线设置,其实是tableView的属性separatorStyle】

    将UITableView的separatorStyle属性设置为UITableViewCellSeparatorStyleNone即可,如下:

    tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

    【289】【隐藏导航条】

    // 导航控制器的显示和隐藏【提示,如果使用navigationBarHidden属性,侧滑会出问题】

    - (void)viewWillAppear:(BOOL)animated

    {

    [super viewWillAppear:animated];

    self.navigationController.navigationBar.hidden = YES;

    }

    - (void)viewWillDisappear:(BOOL)animated

    {

    [super viewWillDisappear:animated];

    self.navigationController.navigationBar.hidden = NO;

    }

    【286】【Cell点击特效 取消】

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    【285】【动画特效1】

    CAKeyframeAnimation * animation;

    animation = [CAKeyframeAnimation animationWithKeyPath:@transform];

    animation.duration = 0.5;

    animation.delegate = self;

    animation.removedOnCompletion = YES;

    animation.fillMode = kCAFillModeForwards;

    NSMutableArray *values = [NSMutableArray array];

    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)]];

    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];

    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.9, 0.9, 0.9)]];

    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0, 1.0, 1.0)]];

    animation.values = values;

    [_contentView.layer addAnimation:animation forKey:nil];

    【284】【url schemes】

    工程--->targets--->info--->urlTypes

    identifier: com.sg31.www

    url schemes: beyond

    下面的为接收到外部调用的时候程序启动,响应方法,在safari输入:beyond://com.sg31.www

    - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {

    if ([[url scheme] isEqualToString:@beyond]) {

    NSLog(@外部调用成功);

    }

    return YES;

    }

    【283】【iOS开发的一些奇巧淫技】【进入网址】

    【282】【auto adjust cell】

    viewdidload

    tableView.rowHeight = UITableViewAutomaticDimension;

    tableView.estimatedRowHeight = 10;

    cellForRow

    [cell layoutIfNeeded];

    【281】【btn得到cell得到table得到row】

    while (![btn isMemberOfClass:[self class]]){

    btn = (UIButton *)[btn superview];

    }

    MyProjectCell *cell = (MyProjectCell *)btn;

    UITableView *tableView = (UITableView *)cell;

    while (![tableView isMemberOfClass:[UITableView class]]){

    tableView = (UITableView *)[tableView superview];

    }

    NSIndexPath *path = [tableView indexPathForCell:cell];

    row = path.row;

    // 已经弃用,调用外界的控制器的block,并将cell的行号传递过去

    // _wannaChangeStatusBlock(row); 调用外界的控制器的block,并将cell的行号传递过去

    _wannaChangeStatusBlockExt(row,cell);

    【279】【textView占位】

    Easy way, just create placeholder text in UITextView by using the following UITextViewDelegate methods:

    - (void)textViewDidBeginEditing:(UITextView *)textView

    {

    if ([textView.text isEqualToString:@placeholder text here...]) {

    textView.text = @;

    textView.textColor = [UIColor blackColor]; //optional

    }

    [textView becomeFirstResponder];

    }

    - (void)textViewDidEndEditing:(UITextView *)textView

    {

    if ([textView.text isEqualToString:@]) {

    textView.text = @placeholder text here...;

    textView.textColor = [UIColor lightGrayColor]; //optional

    }

    [textView resignFirstResponder];

    }

    just remember to set myUITextView with the exact text on creation e.g.

    UITextView *myUITextView = [[UITextView alloc] init];

    myUITextView.delegate = self;

    myUITextView.text = @placeholder text here...;

    myUITextView.textColor = [UIColor lightGrayColor]; //optional

    and make the parent class a UITextViewDelegate before including these methods e.g.

    @interface MyClass ()

    @end

    【进入网址】

    【274】【nsrange,是 一个结构体,方法: NSMakeRange(<#NSUInteger loc#>, <#NSUInteger len#>)】

    【273】【iOS开发的一些奇巧淫技】【查看原文】

    【272】【awakeFromNib】

    - (id)initWithFrame:(CGRect)frame

    {

    self = [super initWithFrame:frame];

    if (self) {

    // Initialization code

    }

    return self;

    }

    - (void)awakeFromNib{

    [super awakeFromNib];

    NSLog(@call %s, __FUNCTION__);

    self.backgroundColor = [UIColor redColor];

    // 其他初始化方法

    }

    【271】【先对数组统一排序,再进行分组,再组内排序】

    // 其他情况,返回是数组

    NSMutableArray *contentDictArr = (NSMutableArray *)content;

    DLog(@返回是数组,长度是 %d,contentDictArr.count);

    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    // NSArray 转成 NSMutableArray

    // 0、对于不启用的,即enabled为0的字典模型,删除掉

    NSMutableArray *dictArr = [NSMutableArray array];

    for (NSInteger i = 0; i < contentDictArr.count; i++) {

    NSDictionary *dict = contentDictArr[i];

    if ([[dict objectForKey:@FEnabled]intValue] == 1) {

    [dictArr addObject:dict];

    }

    }

    // DLog(@清除未启用的字典后的数组:%@,dictArr);

    // 0.1、对于被包含的模块,暂时剔除

    NSMutableArray *tempdictArr = [NSMutableArray array];

    for (NSInteger i = 0; i < dictArr.count; i++) {

    NSDictionary *dict = dictArr[i];

    // 如果有值,则说明是某个模块的子模块@26e86235-e04c-46e1-a7d5-6d513c02de39

    // 如果没有值,即NSNull,表示是根目录模块,直接展示

    if ([[dict objectForKey:@FUpCMID] class] == [NSNull class]) {

    [tempdictArr addObject:dict];

    }

    } 1、对数组按GroupTag排序

    NSArray *sortDesc = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@FGroupTag ascending:YES]];

    NSArray *sortedArr = [tempdictArr sortedArrayUsingDescriptors:sortDesc];

    // DLog(@排序后的数组:%@,sortedArr);

    2、对数组进行分组,按GroupTag

    // 遍历,创建组数组,组数组中的每一个元素是一个模型数组

    NSMutableArray *testGroupArr = [NSMutableArray array];

    NSMutableArray *currentArr = [NSMutableArray array];

    // 因为肯定有一个字典返回,先添加一个

    [currentArr addObject:sortedArr[0]];

    [testGroupArr addObject:currentArr];

    // 如果不止一个,才要动画添加

    if(sortedArr.count > 1){

    for (NSInteger i = 1; i < sortedArr.count; i++) {

    // 先取出组数组中 上一个模型数组的第一个字典模型的groupID

    NSMutableArray *preModelArr = [testGroupArr objectAtIndex:testGroupArr.count-1];

    NSInteger preGroupID = [[[preModelArr objectAtIndex:0] objectForKey:@FGroupTag] intValue];

    // 取出当前字典,根据groupID比较,如果相同则添加到同一个模型数组;如果不相同,说明不是同一个组的

    NSDictionary *currentDict = sortedArr[i];

    NSInteger groupID = [[currentDict objectForKey:@FGroupTag] intValue];

    if (groupID == preGroupID) {

    [currentArr addObject:currentDict];

    }else{

    // 如果不相同,说明 有新的一组,那么创建一个模型数组,并添加到组数组testGroupArr

    currentArr = [NSMutableArray array];

    [currentArr addObject:currentDict];

    [testGroupArr addObject:currentArr];

    }

    }

    }

    // 3、遍历 对每一组 进行排序

    NSMutableArray *tempGroupArr = [NSMutableArray array];

    for (NSArray *arr in testGroupArr) {

    // NSArray *sortDesc = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@FOrder ascending:YES]];

    NSArray *tempArr = [arr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

    if([[obj1 objectForKey:@FOrder]intValue] < [[obj2 objectForKey:@FOrder]intValue]){

    return NSOrderedAscending;

    }

    if([[obj1 objectForKey:@FOrder]intValue] > [[obj2 objectForKey:@FOrder]intValue]){

    return NSOrderedDescending;

    }

    return NSOrderedSame;

    }];

    [tempGroupArr addObject:tempArr];

    }

    testGroupArr = tempGroupArr;

    DLog(@封装好的group数组:%@,testGroupArr);

    //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    // testGroupArr 将封装好的字典数组缓存起来,以便下次调用 userDefault_localGroupArr

    // 根据用户上次选择的,展示

    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];

    [userDefault setBool:YES forKey:@userDefault_hasCached_moduleDictArr];

    NSString *jsonStr = testGroupArr.JSONString;

    DLog(@没有网络的时候用:jsonStr:%@,jsonStr);

    [userDefault setObject:jsonStr forKey:@testGroupArr_jsonStr];

    [userDefault sync

    【270】【自动布局scrollView】

    contentSize 必须明确指定,如label距离下方多少,距离右边多少,这样才可以 让scrollView计算出contentSize

    【查看原文】

    【267】【inDatabase: was called reentrantly on the same queue, which would lead to a deadlock】

    在使用时,如果在queue里面的block执行过程中,又调用了 indatabase方法,则会检查 是不是同一个queue,如果是同一个queue会死锁;原因很简单:

    队列里面 放了一个block,该block又在 本队列 后面放了一个 block;

    从而:前一个block 里面 调用了 后一个block,必须等后一个block执行完成了,

    前一个block才会 出队列;

    而后一个block想要执行,则又必须先等 前一个block出队列;

    因此 死锁!!!!

    解决方法:在indatabase的block中,不要再调用indatabase方法

    [[[DBHelper shareInstance] dbQueue]inDatabase:^(FMDatabase *db){

    isSuccess = [self.helper update4Table:TB_User_Friend withArgs:args where:where];

    }];

    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    - (void)inDatabase:(void (^)(FMDatabase *db))block {

    /* Get the currently executing queue (which should probably be nil, but in theory could be another DB queue

    * and then check it against self to make sure we're not about to deadlock. */

    FMDatabaseQueue *currentSyncQueue = (__bridge id)dispatch_get_specific(kDispatchQueueSpecificKey);

    assert(currentSyncQueue != self && inDatabase: was called reentrantly on the same queue, which would lead to a deadlock);

    }

    【261】【ios_xib_preview预览】

    右上方----show the assistant edit ---- 选择新窗口中manual最下方的Preview

    【258】【应该竖屏,仅在视频播放页面横屏】

    在app delegate中,启动时,

    [userDefault setBool:NO forKey:@userDefault_isAllowLandscape];

    [userDefault synchronize];

    在app delegate中,通过一个本地保存的key进行判断,是否进行横屏

    - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window

    {

    // 全局的设置:允许竖屏+横屏

    NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];

    BOOL isAllowLandscape = [userDefault boolForKey:@userDefault_isAllowLandscape];

    if (isAllowLandscape) {

    return UIInterfaceOrientationMaskPortrait|UIInterfaceOrientationMaskLandscape;

    } else {

    return UIInterfaceOrientationMaskPortrait;

    }

    }

    在视频播放控制器中,更改本地保存的key即可

    【257】【模拟器上面 播放视频崩溃】

    iphone 4s 8.0系统的模拟器上面 播放视频:

    崩溃:

    Apr 9 11:44:39 [jun] rtcreporting[57158] : logging starts...

    Apr 9 11:44:39 [jun] rtcreporting[57158] : setMessageLoggingBlock: called

    原因:

    在模拟器上面播放视频

    解决办法:

    去掉全局断点,这是一个bug

    【256】【iphone真机死活不旋转】

    死活不走代理方法:

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

    {

    return (interfaceOrientation == UIInterfaceOrientationPortrait

    || interfaceOrientation == UIInterfaceOrientationLandscapeLeft

    || interfaceOrientation == UIInterfaceOrientationLandscapeRight);

    }

    原因可能是:手机上拉快速设置栏中:竖排方向锁定 :打开了

    【255】【导航返回按钮】

    UIButton* btn = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, image.size.width+10, 40)];

    btn.showsTouchWhenHighlighted = YES;

    [btn setImage:image forState:UIControlStateNormal];

    [btn addTarget:theTarget action:sel forControlEvents:UIControlEventTouchUpInside];

    UIBarButtonItem *backBtn = [[UIBarButtonItem alloc] initWithCustomView:btn];

    backBtn.tag = 9528;

    vc.navigationItem.leftBarButtonItem = backBtn;

    【254】【ios_VLC】

    VLC for iOS 2.3.0

    关于VLC配置问题,根据个人经验整理了一下,希望能帮到需要的朋友。

    官网链接:https://wiki.videolan.org/IOSCompile/

    百度云盘链接:http://pan.baidu.com/s/1bnEOXPH 密码:ur4l

    配置说明(百度云盘)

    官网按照说明操作就可以了只是下载的地址是个谷歌的什么网站,所以你懂得。

    百度云盘下载下来后需要配置下文件VLC/ios/External 这个文件夹下面有六个文件(快捷方式):MediaLibraryKit,MobileVLCKit,PLCrashReporter,QuincyKit,gtl,upnpx

    重新配置下这六个文件路径就可以用了,vlc源码是区分真机和模拟器的

    终端配置路径

    1、在终端进入External文件夹

    2、ln -s -f是终端修改文件路径的,关于终端命令不懂的朋友请百度,在此就不班门弄斧了。

    真机就用Release-iphoneos,模拟器就用Release-iphonesimulator

    ln -s -f /Users/stlink/Desktop/VLC/ios/ImportedSources/MediaLibraryKit/build/Release-iphoneos MediaLibraryKit

    ln -s -f /Users/stlink/Desktop/VLC/ios/ImportedSources/VLCKit/build/Release-iphoneos MobileVLCKit

    ln -s -f /Users/stlink/Desktop/VLC/ios/ImportedSources/PLCrashReporter/build/Release-iphoneos PLCrashReporter

    ln -s -f /Users/stlink/Desktop/VLC/ios/ImportedSources/QuincyKit/client/iOS/QuincyLib/build/Release-iphoneos QuincyKit

    ln -s -f /Users/stlink/Desktop/VLC/ios/ImportedSources/GDrive/build/Release-iphoneos gtl

    ln -s -f /Users/stlink/Desktop/VLC/ios/ImportedSources/upnpx/projects/xcode4/upnpx/build/Release-iphoneos upnpx

    3、路径正确的话就没问题了,ls -l 查看文件路径

    修改完成后就可以启动了VLC/iOS/VLC for iOS.xcodeproj

    注意:我有时候配置正确路径但是文件还是报错,这种情况的话解压重新搞吧,暂时不知道怎么处理。

    SimplePlayback

    这个是VLC在线播放的一个demo,路径:VLC/ios/ImportedSources/VLCKit/Examples_iOS/SimplePlayback

    项目直接拷贝出来不能用的,要配置下。

    libMobileVLCKit.a 这个demo用到这个静态库。静态库区分真机和模拟器的。静态库我不太懂怎么配置,搞了几次没搞定

    不过有另外的办法MobileVLCKit.framework这个不区分真机和模拟器的。

    路径:VLC/ios/ImportedSources/VLCKit/build

    注意:Deployment target 要低于7.0

    END

    最后希望能帮到需要的朋友,不懂得可以联系我,qq:527993842,加好友请说明谢谢,由于工作原因可能无法及时回复请见谅,而且我也是刚接触vlc。

    关键词:iOS VLC

    MediaLibraryKit项目中的Search paths使用相对路径就可以了。

    Header Search Paths --> ../../External/MobileVLCKit/include

    Library Search Paths --> ../../External/MobileVLCKit

    MediaLibraryKit项目中相对路径$(SRCROOT)得到的值是/XXX/XXX/VLC/ios/ImportedSources/MediaLibraryKit,而不是想象中的/XXX/XXX/VLC/ios/

    多谢LZ的奉献~~~

    【查看原文】

    【253】【ios_VLC】【查看原文】

    【247】【dispatch_after延时改变约束】

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

    // 当事件触发时,改变其constant值,然后调用约束所在的对象的 layoutIfNeeded方法,固定的~ 例如:

    _topView.collectionViewHeightConstraint.constant = 50;

    // self.leftMarginConstraint.constant = 100;

    // self.widthConstraint.constant = 200;

    [UIView animateWithDuration:2.0 animations:^{

    [self.view layoutIfNeeded];

    [_topView layoutIfNeeded];

    }];

    });

    【246】【this class is not key value coding-compliant for the key HeightConstraint】

    问题:

    this class is not key value coding-compliant for the key HeightConstraint

    原因:

    在IB上拖线时的时候,有多的 ,删除掉即可

    解答:

    【227】【ios_数组中放枚举】

    NSInteger _btnTagArr[4] = {ContactSelectBtnChatting,ContactSelectBtnTel,isTeacher?ContactSelectBtnLeave:ContactSelectBtnDetail};

    【226】【实时获得webView的contentSize】

    iOS 如何计算UIWebView的ContentSize

    首选要等UIWebView加载内容后,然后在它的回调方法里将webview的高度Height设置足够小,就设置为1吧,因为这样才能用

    sizeThatFits才能计算出webview得内容大小

    - (void)webViewDidFinishLoad:(UIWebView *)aWebView {

    CGRect frame = aWebView.frame;

    frame.size.height = 1;

    aWebView.frame = frame;

    CGSize fittingSize = [aWebView sizeThatFits:CGSizeZero];

    frame.size = fittingSize;

    aWebView.frame = frame;

    NSLog(@size: %f, %f, fittingSize.width, fittingSize.height);

    }

    UIWebView计算高度 (2013-10-09 14:48:39)转载▼

    标签: uiwebview 高度 计算 sizethatfits 分类: ios

    第一种:

    - (void)webViewDidFinishLoad:(UIWebView *)webView{

    float height = [[webView stringByEvaluatingJavaScriptFromString:@document.body.offsetHeight;] floatValue];

    //document.body.scrollHeight

    }

    第二种:

    - (void) webViewDidFinishLoad:(UIWebView *)webView

    {

    CGRect frame = webView.frame;

    CGSize fittingSize = [webView sizeThatFits:CGSizeZero];

    frame.size = fittingSize;

    webView.frame = frame;

    }

    另外一种

    - (void)viewDidLoad {

    [super viewDidLoad];

    webview.delegate = self;

    [webview loadHTMLString:@

    fdasfda

    baseURL:nil];

    }

    - (void)webViewDidFinishLoad:(UIWebView *)webView

    {

    NSString *output = [webview stringByEvaluatingJavaScriptFromString:@document.getElementByIdx_x_x_x(foo).offsetHeight;];

    NSLog(@height: %@, output);

    }

    【224】【popping动画演示】【进入网址】

    【223】【第3方集成支付】【进入网址】

    【222】【IOS7新特性之XCODE】【进入网址】

    【218】【变量名和类型相同时的异常错误】

    FilterCtrl *FilterCtrl = [[FilterCtrl alloc]init];

    这样命名变量,会报错,提示:没有声明alloc方法。。。。

    【217】【定义枚举】

    // 定义一个枚举

    typedef enum {

    // 返回按钮

    FootViewBtnTypeBack,

    // 我的

    FootViewBtnTypeMine,

    // 写评论

    FootViewBtnTypeWriteComment,

    // 查看评论

    FootViewBtnTypeReadComment,

    // 关注、取消关注

    FootViewBtnTypeAttention,

    // 更多按钮

    FootViewBtnTypeMore

    } FootViewBtnType;

    【216】【scrollView滚动方向】

    向上拉时,contentOffset.y为正

    向下拉时,contentOffset.y为负

    滚动判断用到的变量:

    typedef void (^ScrollBlock)(void);

    // 向上滚动时的block

    @property (nonatomic,strong) ScrollBlock scrollUpBlock;

    // 向下滚动时的block

    @property (nonatomic,strong) ScrollBlock scrollDownBlock;

    // 滚动判断

    CGFloat startY;

    BOOL isNowUp;

    BOOL isDown;

    BOOL isUserDrag;

    #pragma mark - 滚动,新增,显示,隐藏

    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

    {

    // 开始时,标记置真

    isUserDrag = YES;

    // 记录一下开始滚动的offsetY

    startY = scrollView.contentOffset.y;

    }

    - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate

    {

    // 结束时,置flag还原

    isUserDrag = NO;

    }

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView

    {

    // 只有用户drag时,才进行响应

    if(isUserDrag){

    // 实时

    // 判断一下,并发出通知

    CGFloat newY = scrollView.contentOffset.y;

    if(startY - newY >0){

    // 说明向上滚动

    if(!isNowUp){

    //通过block告诉外部控制器

    if(_scrollUpBlock){

    _scrollUpBlock();

    }

    isNowUp = YES;

    isDown = NO;

    }

    }else if(startY - newY<0){

    // 说明向下滚动

    if(!isDown){

    //通过block告诉外部控制器

    if(_scrollDownBlock){

    _scrollDownBlock();

    }

    isDown = YES;

    isNowUp = NO;

    }

    }

    startY = scrollView.contentOffset.y;

    }

    }

    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{

    if (_scrollDownBlock && self.tableView.contentSize.height - (self.tableView.contentOffset.y+self.tableView.bounds.size.height) < 1) {

    _scrollDownBlock();

    return;

    }

    if(_scrollUpBlock){

    _scrollUpBlock();

    isNowUp = YES;

    isDown = NO;

    return;

    }

    }

    【214】【MJRefresh的github】【点击下载】

    【211】【如何设置appIcon】【点击targets--->general--->use asset catalog】【查看原文】

    【210】【DLog】

    #ifdef DEBUG

    #define DLog(fmt, ...) NSLog((@%s [Line %d] fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);

    #else

    #define DLog(...)

    #endif

    【209】【特效滤镜】【点击下载】

    【208】【往模拟器里添加照片的最简单的方法:直接把照片拖到模拟器上就可以了】

    【202】【OCR图像识别】【可以实现类似taobao客户端扫描银行卡号的功能】【查看原文】

    【201】【Not a git repository】

    fatal: Not a git repository (or any of the parent directories): .git

    解决办法:git init 即可

    【199】【第3方_VKPlayer播放器】【进入网址】

    【198】【pod install报错 版本不兼容】【VKVideoPlayerTests` (iOS 5.0) is not compatible with `Expecta (0.3.2)` which,解决方法:将项目deployment改高一点如:6.1即可】

    【197】【CardI扫描卡没有反应】【 card.io only scans 5 card types (MasterCard, Visa, Discover, American Express, JCB),后面是stackoverflow的解答】【进入网址】 【查看原文】

    【196】【无法在真机运行,XCode提示ineligible device】【解决办法:在targets---->build settings---->iOS Deployment Target选择iOS6.1或者更低的版本】

    【195】【正则NSPredicate检查中文】

    // 检查汉字,YES代表全是汉字

    - (BOOL)isHanziCheck:(NSString *)str

    {

    // NSString *regex = @[a-zA-Z一-龥][a-zA-Z0-9一-龥]+;

    NSString *regex = @[一-龥]{2,8};

    NSPredicate *pred = [NSPredicate predicateWithFormat:@SELF MATCHES %@, regex];

    if(![pred evaluateWithObject: str]){

    /*

    //此动画为在顶上显示文字

    [MPNotificationView notifyWithText:@昵称只能由中文、字母或数字组成

    andDuration:0.5];

    */

    return NO;

    }

    return YES;

    }

    【186】【判断包含字符串NSRange】

    NSRange range = [requestURLStr rangeOfString:@sg31.com];

    if (range.length > 0) {

    }

    或者

    if(range.location !=NSNotFound){

    }

    【184】【SDWebImage默认会永久缓存一张图片】【但如果同一个url下的图片是变化的,那暂时想到的是用内存缓存,[imgView sd_setImageWithURL:url placeholderImage:imgPlace options:SDWebImageCacheMemoryOnly];】

    【180】【URL Schemes打开app】【进入网址】

    【179】【URL Schemes打开app】【进入网址】

    【165】【UILabel显示:标题。。。张数,设置NSLineBreakByTruncatingMiddle即可】

    【162】【UserDefault写入的目录是:/var/mobile/Applications/Library/Preferences/com.beyond.testUserD.plist】

    【161】【自动定位:中国浙江省杭州市西湖区西溪街道文二路下宁巷3-1号, 中国浙江省杭州市西湖区西溪街道文二路下宁巷3-1号 @ <+30.28138170,+120.14211600> +/- 100.00m, region (identifier <+30.28138150,+120.14211600> radius 49.29) <+30.28138150,+120.14211600> radius 49.29m】

    【160】【自动定位:No. 3-1 Xianing Alley, No. 3-1 Xianing Alley, Wen'er Road Xixi Residential District, Xihu Hangzhou, Zhejiang China @ <+30.28138170,+120.14211600> +/- 100.00m, region (identifier <+30.28138150,+120.14211600> radius 49.29) <+30.28138150,+120.14211600> radius 49.29m】

    【80】【打开模拟器】【XCode-->Open Developer Tool-->Simulator】

    【79】【Unable to determine simulator device to boot】【原因:XCode不知道选择哪一个模拟器去运行app. 解决方法:退出所有XCode和模拟器,若还不行,就重启mac】

    【78】【错误installAppearanceSwizzlesForSetter】【原因是:[[UINavigationBar appearance] setTranslucent:NO]在iOS8中才有, 解决办法:#define IOS8 [[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0 if(IOS8 && [UINavigationBar conformsToProtocol:@protocol(UIAppearanceContainer)]) { [[UINavigationBar appearance] setTranslucent:NO]; }】

    【71】【判断tableView滚动到了最后一行】【self.tableView.contentSize.height =contentOffset+bounds.size.height】

    【61】【Cell中,先执行这个- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier,再执行这个-(void)awakeFromNib;】

    【60】【AutoLayout中,如何让ImageView保持固定的宽高比?例如1:1】【先将imageViewframe手动写成:宽20,高20,再勾选Aspect Ratio添加宽高比约束】【查看原文】

  • 相关阅读:
    zabbix
    amoeba 读写分离
    部署MySQL-主从异步复制
    MySQL 基本操作
    mysql 完整备份和恢复
    正则匹配表达式各个符文表达的意义
    Include和require的区别
    nosql和Mysql的区别
    Git与SVN的区别
    mongodb与mysql区别
  • 原文地址:https://www.cnblogs.com/huayuan320/p/5777610.html
Copyright © 2020-2023  润新知