項目知識點.Part1

1. storyboard中添加scrollview:

先添加scrollView,進行約束數組

添加View 進行約束 相對於scrollView安全

若是水平滑動:設置vertically in Container   豎直方向滑動:Horizontally in Container網絡

將View的寬度以scroView爲基準  改變倍數多線程

2. 相似於音樂播放器中的圖片旋轉:定時器

在M_PI前面添加負號  可實現反方向轉async

1>  masksToBounds 容許修改layout裏的屬性

[self.MusicImageView layoutIfNeeded]: 當須要改變layout的時候,調用oop

第一種旋轉:  比較麻煩 還得設置current值在不斷更新:atom

// 設置圖片爲圓形:
    // 修改layout前 先將masksToBounds設置爲YES
    [self.MusicImageView layoutIfNeeded];    
    self.imageDetail.layer.masksToBounds = YES;
    self.imageDetail.layer.cornerRadius = self.imageDetail.frame.size.width/2;
    
    [NSTimer scheduledTimerWithTimeInterval:0.01f target:self selector:@selector(rotateAction) userInfo:nil repeats:YES];
 // 將定時器加到runloop中
    [[NSRunLoop currentRunLoop] addTimer:time forMode:NSRunLoopCommonModes];

 

- (void)rotateAction {
    current += 0.001;
    CGAffineTransform transform = CGAffineTransformMakeRotation(M_PI * current);
    self.imageDetail.transform = transform;
    
}

 第二種更新:不須要設置其餘變量實時更新spa

在block中:.net

runLoop:子線程中就關閉了線程

滑動頁面時不會由於優先級的問題 影響圖片轉動

- (void)play {
    [self.avPlayer play];
    self.isPlay = YES;
    // 定時器使用方法:
    /*
     每隔TimeInterval0.1秒調用這個方法
     */
    if (self.timer == nil) {
        self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(playTimer) userInfo:nil repeats:YES];
    }
    // 將定時器加到runloop中
    [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
    
}

block調用中:

self.MusicImageView.transform = CGAffineTransformRotate(self.MusicImageView.transform, M_PI / 180);

 

2> 定時器:

[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(playTimer) userInfo:nil repeats:YES] :

每隔TimeInterval秒調用這個方法

定時器銷燬:

[self.timer invalidate];

安全寫法:

建立前判斷是否爲空

銷燬前判斷是否存在 

// 建立
if (self.timer == nil) {
        self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(playTimer) userInfo:nil repeats:YES];
    }


// 銷燬
if (self.timer) {
        // 銷燬定時器
        [self.timer invalidate];
        // 手動置空:
        self.timer = nil;
    } 

3. scrollView:

約束了scroll只能在豎直方向滑動  下面這個屬性爲YES時 scrollView在水平方向上也能夠滑動 只有改爲NO  才只能在豎直方向滑動

// 自動添加了上下64 設置爲NO 取消viewController自動調整
    self.automaticallyAdjustsScrollViewInsets = NO;

4. __weak   __block 修飾self 防止循環引用:

在本類調用其餘類中的block,使用self不會形成循環引用

5. block使用:

block聲明:

@property (copy,nonatomic) void (^block)(NSString *);

block實現:

實現的內容暫時不走 先把block實現的代碼塊存起來

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    TwoViewController *twoVC =(TwoViewController *) segue.destinationViewController;
    // block實現
    twoVC.block = ^(NSString *str) {
        self.label.text = str;
    };
}

block調用:

當調用block的時候(安全寫法:調用前先判斷block是否存在):self.block(self.textField.text)---->開始執行上述存起來的block實現代碼塊 將調用傳進來的值賦給實現代碼

- (IBAction)popViewController:(UIButton *)sender {
    // block調用:
    if (self.block) {
        self.block(self.textField.text);
    }
    [self.navigationController popViewControllerAnimated:YES];
}

6.

1> 設置pch文件 :Prefix Header

絕對路徑:拷貝到其餘電腦就很差用了 /Users/lanou3g/Documents/項目期/MusicTextOne/Class/Help/PrefixHeader.pch

相對路徑:$(SRCROOT)/Class/Help/PrefixHeader.pch

2> componentsSeparatedByString:根據某個字符串分割, 返回值是數組

7. 多線程實現網絡請求 數據解析:

+ (void)ResquestDataURL:(NSString *)URLStr block:(void(^)(NSArray *))block {
    
    // 子線程請求數據
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSArray *array = [NSArray arrayWithContentsOfURL:[NSURL URLWithString:URLStr]];// 獲取數據
        // 建立model數組
        NSMutableArray *modelArray =[NSMutableArray array];
        for (NSDictionary *dic in array) {
            MusicModel *model = [[MusicModel alloc] init];
            [model setValuesForKeysWithDictionary:dic];
            [RequestData musicModelRequest:model];
            [modelArray addObject:model];
        }
        
        // 主線程返回數據
        dispatch_async(dispatch_get_main_queue(), ^{
            // 在主線程返回數據
            if (block) {
                NSLog(@"block = %@", block);
                block(modelArray);
            }
        });
    });
//    NSLog(@"哈哈哈哈哈哈");
}

 8. 獲取storyboard中的控制器方法:

UIStoryboard *storyB = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    ListenDetailViewController *DetailVC = [storyB instantiateViewControllerWithIdentifier:@"detail_id"];

 9. 獲取自定義UITableViewCell中的按鈕所在的cell

這個點也很重要哦 ~

-(IBAction)button:(id)sender{  
    UIButton* button = (UIButton*)sender;   
    UITableViewCell* buttonCell = (UITableViewCell*)[sender superview];   
    NSUInteger row = [[tableView indexPathForCell:buttonCell]row];  
}

 10.iOS NSString 和NSData 轉換

格式轉換部分的原博:http://blog.csdn.net/bailu66/article/details/7665357 

(除格式轉換的其餘內容均爲本人所寫)

NSString 轉換成NSData 對象

NSData* xmlData = [@"testdata" dataUsingEncoding:NSUTF8StringEncoding];

NSData 轉換成NSString對象

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

NSData 轉換成char*

NSData *data;
char *test=[data bytes];

char* 轉換成NSData對象

byte* tempData = malloc(sizeof(byte)*16);
NSData *content=[NSData dataWithBytes:tempData length:16];

 

 

 

 

哈哈哈

相關文章
相關標籤/搜索