1. 程式人生 > >ios 生僻小技巧和總結

ios 生僻小技巧和總結

連結:http://www.jianshu.com/p/1ff9e44ccc78

3、禁用button高亮

button.adjustsImageWhenHighlighted = NO;
或者在建立的時候
 UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

4、tableview遇到這種報錯failed to obtain a cell from its dataSource

是因為你的cell被呼叫的早了。先迴圈使用了cell,後又建立cell。順序錯了
可能原因:1、xib的cell沒有註冊 2、記憶體中已經有這個cell的快取了(也就是說通過你的cellId找到的cell並不是你想要的型別),這時候需要改下cell的標識

5、cocoa pods報這個錯誤:unable to access 'https://github.com/facebook/pop.git/': Operation timed out after 0 milliseconds with 0 out of 0 bytes received

解決辦法:原因可能是網路問題,網路請求超時了,只需要重試就行了

6、cocoa pods 出現ERROR: While executing gem ... (Errno::EPERM)

8、去除陣列中重複的物件

NSArray *newArr = [oldArr valueForKeyPath:@“@distinctUnionOfObjects.self"];

9、編譯的時候遇到 no such file or directory: /users/apple/XXX

是因為編譯的時候,在此路徑下找不到這個檔案,解決這個問題,首先是是要檢查缺少的檔案是不是在工程中,如果不在工程中,需要從本地拖進去,如果發現已經存在工程中了,或者拖進去還是報錯,這時候需要去build phases中搜索這個檔案,這時候很可能會搜出現兩個相同的檔案,這時候,有一個路徑是正確的,刪除另外一個即可。如果刪除了還是不行,需要把兩個都刪掉,然後重新往工程裡拖進這個檔案即可


build phases

13、SDWebImage本地快取策略需要注意。如果之前快取過一張圖片,即使下次伺服器換了這張圖片,但是圖片url沒換,用sdwebimage下載下來的還是以前那張,所以遇到這種問題,不要先去懟伺服器,清空下快取再試就好了。

17、開發中如果要動態修改tableView的tableHeaderView或者tableFooterView的高度,需要給tableView重新設定,而不是直接更改高度。正確的做法是重新設定一下tableView.tableFooterView = 更改過高度的view。為什麼?其實在iOS8以上直接改高度是沒有問題的,在iOS8中出現了contentSize不準確的問題,這是解決辦法。

20、設定navigationBar上的title顏色和大小

    [self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor youColor], NSFontAttributeName : [UIFont systemFontOfSize:15]}]

31、自定義NSLog


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

44、模型轉字典

static NSSet *classes;

- (NSMutableDictionary *)getParameterDictionary {

    NSMutableDictionary *dict = [NSMutableDictionary dictionary];

    Class c = self.class;

    while (c) {
        unsigned count;
        objc_property_t *properties = class_copyPropertyList([c class], &count);

        for (int i = 0; i < count; i++) {
            NSString *key = [NSString stringWithUTF8String:property_getName(properties[i])];
            dict[key] = [self valueForKey:key];
        }
        free(properties);

        // 獲得父類
        c = class_getSuperclass(c);

        if ([self isClassFromFoundation:c]) break;
    }
    return dict;
}

- (BOOL)isClassFromFoundation:(Class)c
{
    if (c == [NSObject class] || c == [NSManagedObject class]) return YES;

    __block BOOL result = NO;
    [[self foundationClasses] enumerateObjectsUsingBlock:^(Class foundationClass, BOOL *stop) {
        if ([c isSubclassOfClass:foundationClass]) {
            result = YES;
            *stop = YES;
        }
    }];
    return result;
}

- (NSSet *)foundationClasses
{
    if (classes == nil) {
        // 集合中沒有NSObject,因為幾乎所有的類都是繼承自NSObject,具體是不是NSObject需要特殊判斷
        classes = [NSSet setWithObjects:
                              [NSURL class],
                              [NSDate class],
                              [NSValue class],
                              [NSData class],
                              [NSError class],
                              [NSArray class],
                              [NSDictionary class],
                              [NSString class],
                              [NSAttributedString class], nil];
    }
    return classes;
}

49、長按複製功能

- (void)viewDidLoad
{
    [self.view addGestureRecognizer:[[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(pasteBoard:)]];
}
- (void)pasteBoard:(UILongPressGestureRecognizer *)longPress {
    if (longPress.state == UIGestureRecognizerStateBegan) {
        UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
        pasteboard.string = @"需要複製的文字";
    }
}

52、判斷圖片型別

//通過圖片Data資料第一個位元組 來獲取圖片副檔名
- (NSString *)contentTypeForImageData:(NSData *)data
{
    uint8_t c;
    [data getBytes:&c length:1];
    switch (c)
    {
        case 0xFF:
            return @"jpeg";

        case 0x89:
            return @"png";

        case 0x47:
            return @"gif";

        case 0x49:
        case 0x4D:
            return @"tiff";

        case 0x52:
        if ([data length] < 12) {
            return nil;
        }

        NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding];
        if ([testString hasPrefix:@"RIFF"]
            && [testString hasSuffix:@"WEBP"])
        {
            return @"webp";
        }

        return nil;
    }

    return nil;
}

54、獲取一個類的所有屬性

id LenderClass = objc_getClass("Lender");
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList(LenderClass, &outCount);
for (i = 0; i < outCount; i++) {
    objc_property_t property = properties[i];
    fprintf(stdout, "%s %s\n", property_getName(property), property_getAttributes(property));
}

55、image圓角

- (UIImage *)circleImage
{
    // NO代表透明
    UIGraphicsBeginImageContextWithOptions(self.size, NO, 1);
    // 獲得上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    // 新增一個圓
    CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
    // 方形變圓形
    CGContextAddEllipseInRect(ctx, rect);
    // 裁剪
    CGContextClip(ctx);
    // 將圖片畫上去
    [self drawInRect:rect];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

56、image拉伸

+ (UIImage *)resizableImage:(NSString *)imageName
{
    UIImage *image = [UIImage imageNamed:imageName];
    CGFloat imageW = image.size.width;
    CGFloat imageH = image.size.height;
    return [image resizableImageWithCapInsets:UIEdgeInsetsMake(imageH * 0.5, imageW * 0.5, imageH * 0.5, imageW * 0.5) resizingMode:UIImageResizingModeStretch];
}

61、拿到當前正在顯示的控制器,不管是push進去的,還是present進去的都能拿到

- (UIViewController *)getVisibleViewControllerFrom:(UIViewController*)vc {
    if ([vc isKindOfClass:[UINavigationController class]]) {
        return [self getVisibleViewControllerFrom:[((UINavigationController*) vc) visibleViewController]];
    }else if ([vc isKindOfClass:[UITabBarController class]]){
        return [self getVisibleViewControllerFrom:[((UITabBarController*) vc) selectedViewController]];
    } else {
        if (vc.presentedViewController) {
            return [self getVisibleViewControllerFrom:vc.presentedViewController];
        } else {
            return vc;
        }
    }
}

64、KVO監聽某個物件的屬性

// 新增監聽者
[self addObserver:self forKeyPath:property options:NSKeyValueObservingOptionNew context:nil];

// 當監聽的屬性值變化的時候會來到這個方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ([keyPath isEqualToString:@"property"]) {
       [self textViewTextChange];
       } else {
     }
}

72、合併兩個圖片

+ (UIImage*)mergeImage:(UIImage*)firstImage withImage:(UIImage*)secondImage {
    CGImageRef firstImageRef = firstImage.CGImage;
    CGFloat firstWidth = CGImageGetWidth(firstImageRef);
    CGFloat firstHeight = CGImageGetHeight(firstImageRef);
    CGImageRef secondImageRef = secondImage.CGImage;
    CGFloat secondWidth = CGImageGetWidth(secondImageRef);
    CGFloat secondHeight = CGImageGetHeight(secondImageRef);
    CGSize mergedSize = CGSizeMake(MAX(firstWidth, secondWidth), MAX(firstHeight, secondHeight));
    UIGraphicsBeginImageContext(mergedSize);
    [firstImage drawInRect:CGRectMake(0, 0, firstWidth, firstHeight)];
    [secondImage drawInRect:CGRectMake(0, 0, secondWidth, secondHeight)];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

74、為imageView新增倒影

    CGRect frame = self.frame;
    frame.origin.y += (frame.size.height + 1);

    UIImageView *reflectionImageView = [[UIImageView alloc] initWithFrame:frame];
    self.clipsToBounds = TRUE;
    reflectionImageView.contentMode = self.contentMode;
    [reflectionImageView setImage:self.image];
    reflectionImageView.transform = CGAffineTransformMakeScale(1.0, -1.0);

    CALayer *reflectionLayer = [reflectionImageView layer];

    CAGradientLayer *gradientLayer = [CAGradientLayer layer];
    gradientLayer.bounds = reflectionLayer.bounds;
    gradientLayer.position = CGPointMake(reflectionLayer.bounds.size.width / 2, reflectionLayer.bounds.size.height * 0.5);
    gradientLayer.colors = [NSArray arrayWithObjects:
                            (id)[[UIColor clearColor] CGColor],
                            (id)[[UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.3] CGColor], nil];

    gradientLayer.startPoint = CGPointMake(0.5,0.5);
    gradientLayer.endPoint = CGPointMake(0.5,1.0);
    reflectionLayer.mask = gradientLayer;

    [self.superview addSubview:reflectionImageView];

75、畫水印

// 畫水印
- (void) setImage:(UIImage *)image withWaterMark:(UIImage *)mark inRect:(CGRect)rect
{
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.0)
    {
        UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0.0);
    }
    //原圖
    [image drawInRect:self.bounds];
    //水印圖
    [mark drawInRect:rect];
    UIImage *newPic = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    self.image = newPic;
}

76、讓label的文字內容顯示在左上/右上/左下/右下/中心頂/中心底部

自定義UILabel
// 重寫label的textRectForBounds方法
- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines {
    CGRect rect = [super textRectForBounds:bounds limitedToNumberOfLines:numberOfLines];
    switch (self.textAlignmentType) {
        case WZBTextAlignmentTypeLeftTop: {
            rect.origin = bounds.origin;
        }
            break;
        case WZBTextAlignmentTypeRightTop: {
            rect.origin = CGPointMake(CGRectGetMaxX(bounds) - rect.size.width, bounds.origin.y);
        }
            break;
        case WZBTextAlignmentTypeLeftBottom: {
            rect.origin = CGPointMake(bounds.origin.x, CGRectGetMaxY(bounds) - rect.size.height);
        }
            break;
        case WZBTextAlignmentTypeRightBottom: {
            rect.origin = CGPointMake(CGRectGetMaxX(bounds) - rect.size.width, CGRectGetMaxY(bounds) - rect.size.height);
        }
            break;
        case WZBTextAlignmentTypeTopCenter: {
            rect.origin = CGPointMake((CGRectGetWidth(bounds) - CGRectGetWidth(rect)) / 2, CGRectGetMaxY(bounds) - rect.origin.y);
        }
            break;
        case WZBTextAlignmentTypeBottomCenter: {
            rect.origin = CGPointMake((CGRectGetWidth(bounds) - CGRectGetWidth(rect)) / 2, CGRectGetMaxY(bounds) - CGRectGetMaxY(bounds) - rect.size.height);
        }
            break;
        case WZBTextAlignmentTypeLeft: {
            rect.origin = CGPointMake(0, rect.origin.y);
        }
            break;
        case WZBTextAlignmentTypeRight: {
            rect.origin = CGPointMake(rect.origin.x, 0);
        }
            break;
        case WZBTextAlignmentTypeCenter: {
            rect.origin = CGPointMake((CGRectGetWidth(bounds) - CGRectGetWidth(rect)) / 2, (CGRectGetHeight(bounds) - CGRectGetHeight(rect)) / 2);
        }
            break;

        default:
            break;
    }
    return rect;
}
- (void)drawTextInRect:(CGRect)rect {
    CGRect textRect = [self textRectForBounds:rect limitedToNumberOfLines:self.numberOfLines];
    [super drawTextInRect:textRect];
}

77、scrollView上的輸入框,鍵盤擋住的問題

推薦用IQKeyboardManager這個框架!
手動解決如下
1、監聽鍵盤彈出/消失的通知
2、在通知中加入程式碼:
NSDictionary* info = [aNotification userInfo];
CGRect keyPadFrame=[[UIApplication sharedApplication].keyWindow convertRect:[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue] fromView:self.view];
CGSize kbSize =keyPadFrame.size;
CGRect activeRect=[self.view convertRect:activeField.frame fromView:activeField.superview];
CGRect aRect = self.view.bounds;
aRect.size.height -= (kbSize.height);

CGPoint origin =  activeRect.origin;
origin.y -= backScrollView.contentOffset.y;
if (!CGRectContainsPoint(aRect, origin)) {
    CGPoint scrollPoint = CGPointMake(0.0,CGRectGetMaxY(activeRect)-(aRect.size.height));
    [backScrollView setContentOffset:scrollPoint animated:YES];
}

78、frame佈局的cell動態高度

這種通常在你的模型中新增一個輔助屬性cellHeight,在模型中重寫這個屬性的get方法,根據你的佈局和模型中的其他屬性值計算出總高度。最後在tableView:heightForRow方法中,根據indexPath找出對應的模型,返回這個高度即可。

79、AutoLayout佈局的cell動態高度

// 1、設定tableView的屬性
self.tableView.rowHeight = UITableViewAutomaticDimension;
self.tableView.estimatedRowHeight = 44.0; // 這個屬性非0,估計cell高度
// 2、至上而下設定cell的約束,注意,上下左右最好都要頂到cell的四周

cell

82、cell去除選中效果

cell.selectionStyle = UITableViewCellSelectionStyleNone;

83、cell點按效果

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

87、UITextView沒有placeholder的問題?

網上有很多此類自定義控制元件,也可以參考下我寫的一個UITextView分類 UITextView-WZB

90、獲取一個視訊的第一幀圖片

    NSURL *url = [NSURL URLWithString:filepath];
    AVURLAsset *asset1 = [[AVURLAsset alloc] initWithURL:url options:nil];
    AVAssetImageGenerator *generate1 = [[AVAssetImageGenerator alloc] initWithAsset:asset1];
    generate1.appliesPreferredTrackTransform = YES;
    NSError *err = NULL;
    CMTime time = CMTimeMake(1, 2);
    CGImageRef oneRef = [generate1 copyCGImageAtTime:time actualTime:NULL error:&err];
    UIImage *one = [[UIImage alloc] initWithCGImage:oneRef];

    return one;

91、獲取視訊的時長

+ (NSInteger)getVideoTimeByUrlString:(NSString *)urlString {
    NSURL *videoUrl = [NSURL URLWithString:urlString];
    AVURLAsset *avUrl = [AVURLAsset assetWithURL:videoUrl];
    CMTime time = [avUrl duration];
    int seconds = ceil(time.value/time.timescale);
    return seconds;
}

98、UITableView (<UITableView: 0x7ff19b027000; >) failed to obtain a cell from its dataSource (<ViewController: 0x7ff19a507520>)

這個錯誤原因是tableView的代理方法-tableView:cellForRowAtIndexPath:需要返回一個UITableViewCell,而你返回了一個nil。另外這個地方返回值不是UITableViewCell型別也會導致崩潰

99、約束如何做UIView動畫?

1、把需要改的約束Constraint拖條線出來,成為屬性
2、在需要動畫的地方加入程式碼,改變此屬性的constant屬性
3、開始做UIView動畫,動畫裡邊呼叫layoutIfNeeded方法

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *buttonTopConstraint;
self.buttonTopConstraint.constant = 100;
    [UIView animateWithDuration:.5 animations:^{
        [self.view layoutIfNeeded];
    }];

101、將tableView滾動到頂部

[tableView setContentOffset:CGPointZero animated:YES];
或者
[tableView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:YES];

105、刪除NSUserDefaults所有記錄

//方法一
  NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
 [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];   
 //方法二  
- (void)resetDefaults {   
  NSUserDefaults * defs = [NSUserDefaults standardUserDefaults];
     NSDictionary * dict = [defs dictionaryRepresentation];
     for (id key in dict) {
          [defs removeObjectForKey:key];
     }
      [defs synchronize];
 }
// 方法三
[[NSUserDefaults standardUserDefaults] setPersistentDomain:[NSDictionary dictionary] forName:[[NSBundle mainBundle] bundleIdentifier]];

106、禁用系統滑動返回功能

- (void)viewDidAppear:(BOOL)animated
{
     [super viewDidAppear:animated];
if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {self.navigationController.interactivePopGestureRecognizer.delegate = self;
    }
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {self.navigationController.interactivePopGestureRecognizer.delegate = nil;
    }
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
     return NO;
}

107、模擬器報錯


模擬器報錯

解決辦法:
開啟模擬器->Simulator->Reset Content and Settings...
如果不行,就重啟試試!

108、自定義cell選中背景顏色

UIView *bgColorView = [[UIView alloc] init];
bgColorView.backgroundColor = [UIColor redColor];
[cell setSelectedBackgroundView:bgColorView];

109、UILabel設定內邊距

子類化UILabel,重寫drawTextInRect方法
- (void)drawTextInRect:(CGRect)rect {
    // 邊距,上左下右
    UIEdgeInsets insets = {0, 5, 0, 5};
    [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
}

110、UILabel設定文字描邊

子類化UILabel,重寫drawTextInRect方法
- (void)drawTextInRect:(CGRect)rect
{
    CGContextRef c = UIGraphicsGetCurrentContext();
    // 設定描邊寬度
    CGContextSetLineWidth(c, 1);
    CGContextSetLineJoin(c, kCGLineJoinRound);
    CGContextSetTextDrawingMode(c, kCGTextStroke);
    // 描邊顏色
    self.textColor = [UIColor redColor];
    [super drawTextInRect:rect];
    // 文字顏色
    self.textColor = [UIColor yellowColor];
    CGContextSetTextDrawingMode(c, kCGTextFill);
    [super drawTextInRect:rect];
}

112、scrollView滾動到最下邊

CGPoint bottomOffset = CGPointMake(0, scrollView.contentSize.height - scrollView.bounds.size.height);
[scrollView setContentOffset:bottomOffset animated:YES];

115、為UIView某個角新增圓角

// 左上角和右下角新增圓角
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerBottomRight) cornerRadii:CGSizeMake(20, 20)];
    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    maskLayer.frame = view.bounds;
    maskLayer.path = maskPath.CGPath;
    view.layer.mask = maskLayer;

119、讓手機震動一下

倒入框架
#import <AudioToolbox/AudioToolbox.h>
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
或者
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);

120、layoutSubviews方法什麼時候呼叫?

1、init方法不會呼叫
2、addSubview方法等時候會呼叫
3、bounds改變的時候呼叫
4、scrollView滾動的時候會呼叫scrollView的layoutSubviews方法(所以不建議在scrollView的layoutSubviews方法中做複雜邏輯)
5、旋轉裝置的時候呼叫
6、子檢視被移除的時候呼叫
參考請看:http://blog.logichigh.com/2011/03/16/when-does-layoutsubviews-get-called/

121、讓UILabel在指定的地方換行

// 換行符為\n,在需要換行的地方加上這個符號即可,如 
label.numberOfLines = 0;
label.text = @"此處\n換行";

122、搖一搖功能

1、開啟搖一搖功能
    [UIApplication sharedApplication].applicationSupportsShakeToEdit = YES;
2、讓需要搖動的控制器成為第一響應者
[self becomeFirstResponder];
3、實現以下方法

// 開始搖動
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
// 取消搖動
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event
// 搖動結束
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event

124、獲取view的座標在整個window上的位置

// v上的(0, 0)點在toView上的位置
CGPoint point = [v convertPoint:CGPointMake(0, 0) toView:[UIApplication sharedApplication].windows.lastObject];
或者
CGPoint point = [v.superview convertPoint:v.frame.origin toView:[UIApplication sharedApplication].windows.lastObject];

126、修改UISegmentedControl的字型大小

[segment setTitleTextAttributes:@{NSFontAttributeName : [UIFont systemFontOfSize:15.0f]} forState:UIControlStateNormal];

128、獲取一個view所屬的控制器

// view分類方法
- (UIViewController *)belongViewController {
    for (UIView *next = [self superview]; next; next = next.superview) {
        UIResponder* nextResponder = [next nextResponder];
        if ([nextResponder isKindOfClass:[UIViewController class]]) {
            return (UIViewController *)nextResponder;
        }
    }
    return nil;
}

130、UIWebView設定背景透明

[webView setBackgroundColor:[UIColor clearColor]];
[webView setOpaque:NO];

133、設定螢幕方向

 NSNumber *orientationTarget = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeLeft];
[[UIDevice currentDevice] setValue:orientationTarget forKey:@"orientation"];
[UIViewController attemptRotationToDeviceOrientation];

134、比較兩個顏色是否相等

- (BOOL)isEqualToColor:(UIColor *)otherColor {
    CGColorSpaceRef colorSpaceRGB = CGColorSpaceCreateDeviceRGB();

    UIColor *(^convertColorToRGBSpace)(UIColor*) = ^(UIColor *color) {
        if (CGColorSpaceGetModel(CGColorGetColorSpace(color.CGColor)) == kCGColorSpaceModelMonochrome) {
            const CGFloat *oldComponents = CGColorGetComponents(color.CGColor);
            CGFloat components[4] = {oldComponents[0], oldComponents[0], oldComponents[0], oldComponents[1]};
            CGColorRef colorRef = CGColorCreate( colorSpaceRGB, components );

            UIColor *color = [UIColor colorWithCGColor:colorRef];
            CGColorRelease(colorRef);
            return color;            
        } else
            return color;
    };

    UIColor *selfColor = convertColorToRGBSpace(self);
    otherColor = convertColorToRGBSpace(otherColor);
    CGColorSpaceRelease(colorSpaceRGB);

    return [selfColor isEqual:otherColor];
}

135、tableViewCell分割線頂到頭

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    [cell setSeparatorInset:UIEdgeInsetsZero];
    [cell setLayoutMargins:UIEdgeInsetsZero];
    cell.preservesSuperviewLayoutMargins = NO;
}

- (void)viewDidLayoutSubviews {
    [self.tableView setSeparatorInset:UIEdgeInsetsZero];
    [self.tableView setLayoutMargins:UIEdgeInsetsZero];
}

136、不讓控制器的view隨著控制器的xib拉伸或壓縮

self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

140、檢查一個rect是否包含一個point

// point是否在rect內
BOOL isContains = CGRectContainsPoint(rect, point);

141、在指定的寬度下,讓UILabel自動設定最佳font

label.adjustsFontSizeToFitWidth = YES;

142、將一個image儲存在相簿中

UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);

或者
#import <Photos/Photos.h>
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
        PHAssetChangeRequest *changeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
        changeRequest.creationDate          = [NSDate date];
    } completionHandler:^(BOOL success, NSError *error) {
        if (success) {
            NSLog(@"successfully saved");
        }
        else {
            NSLog(@"error saving to photos: %@", error);
        }
    }];

143、修改cell.imageView的大小

UIImage *icon = [UIImage imageNamed:@""];
CGSize itemSize = CGSizeMake(30, 30);
UIGraphicsBeginImageContextWithOptions(itemSize, NO ,0.0);
CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height);
[icon drawInRect:imageRect];
cell.imageView.image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

144、為一個view新增虛線邊框

 CAShapeLayer *border = [CAShapeLayer layer];
    border.strokeColor = [UIColor colorWithRed:67/255.0f green:37/255.0f blue:83/255.0f alpha:1].CGColor;
    border.fillColor = nil;
    border.lineDashPattern = @[@4, @2];
    border.path = [UIBezierPath bezierPathWithRect:view.bounds].CGPath;
    border.frame = view.bounds;
    [view.layer addSublayer:border];

145、UITextView中開啟或禁用複製,剪下,選擇,全選等功能

// 繼承UITextView重寫這個方法
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
// 返回NO為禁用,YES為開啟
    // 貼上
    if (action == @selector(paste:)) return NO;
    // 剪下
    if (action == @selector(cut:)) return NO;
    // 複製
    if (action == @selector(copy:)) return NO;
    // 選擇
    if (action == @selector(select:)) return NO;
    // 選中全部
    if (action == @selector(selectAll:)) return NO;
    // 刪除
    if (action == @selector(delete:)) return NO;
    // 分享
    if (action == @selector(share)) return NO;
    return [super canPerformAction:action withSender:sender];
}

相關推薦

ios 生僻技巧總結

連結:http://www.jianshu.com/p/1ff9e44ccc78 3、禁用button高亮button.adjustsImageWhenHighlighted = NO; 或者在建立的時候 UIButton *button = [UIButton buttonWithType:UIButto

最強 Android Studio 使用技巧快捷鍵

面板 panel 讓其 駝峰 展示 tab鍵 所在 最有 初始 常用技巧 1. 書簽(Bookmarks) 描述:這是一個很有用的功能,讓你可以在某處做個標記(書簽),方便後面再跳轉到此處。 調用:Menu → Navigate → Bookmarks 快捷鍵: 添

JS開發中的一些技巧方法

hello floor apply subst shuf 新的 情況 level 可能 生成指定範圍內的隨機數 當我們需要獲取指定範圍(min,max)內的整數的時候,下面的代碼非常適合;這段代碼用的還挺多的。 function setRadomNum(min,m

vim的一些技巧基本命令

在linux下有一個很神的編輯器我想大家都聽說過應該,vim被稱為編輯器之神,新手在使用vim時候可能會覺得很痛苦,我接觸vim是被我一個老師逼迫的,開個玩笑哈哈,不過我確實愛上了他,vim用起來有種很牛逼的感覺,其實不光是牛逼,vim可以配置很多東西,使他讓我們在使用時候可以很便捷,不會配

IntelliJ IDEA相關技巧外掛 | Mybatis自動生成工具

本文簡單介紹一些idea開發常用外掛和工具,以及一些小技巧,不足之處希望大家指出,我改正。不喜勿噴! 一、IDEA開發小技巧 在使用idea開發過程中我們會對介面有一些潔癖(簡稱強迫症),下面簡單介紹一下個人的習慣: 1.idea如何檢視檔案或專案的歷史提交記錄 在

AS的使用技巧快捷鍵

常用技巧 書籤(Bookmarks) 描述:這是一個很有用的功能,讓你可以在某處做個標記(書籤),方便後面再跳轉到此處。 快捷鍵: 新增/移除書籤:F11(Windows/Linux); 新增/移除書籤(帶標記):Ctrl + F11(Windows/Linux); 顯

iOS 7 : 隱藏技巧變通之道

當 iOS 7 剛釋出的時候,全世界的蘋果開發人員都立馬嘗試著去編譯他們的 app,接著再花上數月的時間來修復任何出現的錯誤,甚至從頭開始重建這個 app。這樣的結果,使得人們根本無暇去探究 iOS 7 所帶來的新思想。除開一些明顯而細微的更新,比如說 NSArray 的 firstObject

Android開發基礎 -- 最強 Android Studio 使用技巧快捷鍵

寫在前面 本文翻譯自 Android Studio Tips by Philippe Breault,一共收集了62個 Android Studio 使用小技巧和快捷鍵。 根據這些小技巧的使用場景,本文將這62個小技巧分為常用技巧(1 – 28)、編碼技巧(29 – 49)和除錯技巧(

更多Requests的技巧以及總結

對於requests的爬蟲庫,我們已經學到了尾聲。 我們在這兒可以挖掘出更多的requests的使用小技巧。 一.cookie物件與字典的轉換 在爬取目標cookie的時候,我們可以將cookie資訊進行簡化處理。 現在做一個簡單的程式碼驗證看看,使用百度的cookies: import

JavaScript中的技巧注意點(二)

tip:自己收集的一些前端注意事項 1.函式優先 函式宣告和變數宣告都會被提升,但是一個值得注意的細節是函式會首先被提升,然後才是變數 foo();//1 var foo; function foo(){ console.log(1);

最強 Android Studio 使用技巧快捷鍵(一)

1. 書籤(Bookmarks) 描述:這是一個很有用的功能,讓你可以在某處做個標記(書籤),方便後面再跳轉到此處。呼叫:Menu → Navigate → Bookmarks快捷鍵: 新增/移除書籤:F3(OS X) 、F11(Windows/Linux);新增/

最強 Android Studio 使用技巧快捷鍵(二)

21. 相關檔案(Related File) 描述:該操作有助於在佈局檔案和Activity/Fragment之間輕鬆跳轉。這也是一個快捷操作,在類名/佈局頂端的左側。快捷鍵:Ctrl + Cmd + Up(OS X)、Ctrl + Alt + Home(Window

IOS開發技巧

如何檢測應用更新? 你可以使用友盟等第三方工具,但如果你只想使用輕量級的方法,只需GET這個介面:http://itunes.apple.com/lookup?id=你的應用程式的ID,解析返回的json字串就行。 我想完全複製一個 UIView 怎麼辦,copy 方法好像用不了 iOS 中

C/C++ 位運算技巧總結

本篇部落格轉載於 基本位運算常用技巧 按位與 & 快速清零 int a=0x0001; a&=0;     //a : 0x0000 保留指定位 int a=0x0111; int b=0x0010; a=a&b;    //a :

C++常用技巧個人總結(持續更新)

求任意陣列長度  sizeof(array) / sizeof(array[0]), ※c++多關鍵字排序: struct node {  int a;int b;int c;//三重引數  friend bool operator<(const node &am

HIVE一些技巧java操作hive

開啟微信掃一掃,關注微信公眾號【資料與演算法聯盟】 1.寫在前邊的話         自己電腦上部署的hive版本是hive1.1.1,在終端執行hive 命令時,凡是涉及where語句時,就會出現異常退出,對於一個開發者怎麼能忍受這種情況

前端優化技巧----個人總結

1,取某段程式碼執行時間:        console.time("aaa");        /* 程式碼段*/       console.timeEnd("aaa");       console.time("bbb");      /* 程式碼段*/  

清北學堂的技巧收獲

覆蓋 class ring 高速度 快速冪 pow cos sizeof ext 剛來到清北學堂,收獲頗多,首先是李昊大佬的一個有用的模板 #include<iostream> #include<algorithm> #include<

css 中的背景圖片技巧存在的坑

本文轉載於:猿2048網站➜css 中的背景圖片小技巧和存在的坑 body 的背景圖設定   第一種 :這種情況下背

總結下常用js中的語法技巧

時間格式 方法 ext 正則 span 指定 匹配 對象 ole 1,數組對象遍歷 對一個級數對象進行遍歷,取出每個值 var arr={ "result":[ {"time":"2018-10-24 12:12:12"}