2012年8月18日土曜日

スワイプ移動、photo再読込、linkとaudioリベンジ

ここ何日かでいろいろ捗った。

・スワイプ移動
でポストを移動できるようになったら、やっぱりシュルっとビジュアル的にスライドしないとなんか気持ち悪いのでやってみた。なかなか良い感じ。
- (void)npost{
 sw=self.view.bounds.size.width,sh=self.view.bounds.size.height;
 if([[pvlayer.view viewWithTag:now]isEqual:[pvArr lastObject]]) return;
 CGRect oldf=[pvlayer.view viewWithTag:now++].frame;oldf.origin.x-=sw;[self refself];
 [pvlayer.view addSubview:[pvArr objectAtIndex:now-1]];[self na];[self mkCaption];[self refpost];
 CGRect nowf=[pvlayer.view viewWithTag:now].frame;nowf.origin.x+=sw;[pvlayer.view viewWithTag:now].frame=nowf;nowf.origin.x-=sw;
 [UIView animateWithDuration:0.2 delay:0 options:UIViewAnimationOptionCurveEaseOut
      animations:^{[pvlayer.view viewWithTag:now-1].frame=oldf;[pvlayer.view viewWithTag:now].frame=nowf;}
      completion:^(BOOL finished){[[pvlayer.view viewWithTag:now-1]removeFromSuperview];}];
 if(now>100) [pvArr replaceObjectAtIndex:now-101 withObject:[NSNull null]];
 if(now+20>[contArr count]){
  if(imout||loadflg)return;
  if(target==@"dshbrd"&&offset+limit>250) offsetflg=NO;
  if(offsetflg){
   offsinceval=[NSString stringWithFormat:@"%d",offset+=limit];
  }else{
   since_id=lastid-(([[idArr objectAtIndex:0]longLongValue]-[[idArr lastObject]longLongValue])/([idArr count]-1)*(limit+1));
   offsinceval=[NSString stringWithFormat:@"%lld",since_id];
  }
  if(!loadflg)[self reqDB];
 }
}
- (void)ppost{
 sw=self.view.bounds.size.width,sh=self.view.bounds.size.height;
 if(now==1)return;
 if([[pvArr objectAtIndex:now-2]isEqual:[NSNull null]]){
  UIAlertView *lost=[[UIAlertView alloc]initWithTitle:@"DEAD END"
             message:@"sorry, but only 100 previous posts are retained for preventing a crash caused by insufficient memory."
               delegate:nil cancelButtonTitle:nil otherButtonTitles:@"oh well.",nil];
  [lost show];[self mkCtrlr:1];return;
 }
 CGRect oldf=[pvlayer.view viewWithTag:now--].frame;oldf.origin.x+=sw;[self refself];
 [pvlayer.view addSubview:[pvArr objectAtIndex:now-1]];[self na];[self mkCaption];[self refpost];
 CGRect nowf=[pvlayer.view viewWithTag:now].frame;nowf.origin.x-=sw;[pvlayer.view viewWithTag:now].frame=nowf;nowf.origin.x+=sw;
 [UIView animateWithDuration:0.2 delay:0 options:UIViewAnimationOptionCurveEaseOut
      animations:^{[pvlayer.view viewWithTag:now+1].frame=oldf;[pvlayer.view viewWithTag:now].frame=nowf;}
      completion:^(BOOL finished){[[pvlayer.view viewWithTag:now+1]removeFromSuperview];}];
 if(now==1)[bprev removeFromSuperview]; 
 [[pvlayer.view viewWithTag:now--] removeFromSuperview];[self refself];
 [pvlayer.view addSubview:[pvArr objectAtIndex:now-1]];
 [self na];[self mkCaption];[self refpost];
 if(now==1)[bprev removeFromSuperview];
}

・photo再読込
SpeedLimitを使ってtimeoutさせてシングルタップで読込ミスったphotoを再読込したりalt_sizeなphotoの場合はoriginalを読むようにしたりした。これはコード書くまでもないかな。

・linkの当たり判定
よりリンクらしく、ボタンじゃなくてCoreText自体をクリックしたらページを開くようにしたくなって当たり判定を調べて入れた。tap時の座標をとってもいいけどとりあえずマーカー的にuiimageviewを貼ってそいつにgesture取らすようにした。
- (id)initWithFrame:(CGRect)frame string:(NSString *)string url:(NSString *)url_
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
  url=url_;
  NSMutableDictionary *attrDic=[NSMutableDictionary dictionaryWithCapacity:0];
  CTFontRef ctFont=CTFontCreateWithName((__bridge CFStringRef)@"Helvetica",24, NULL);
  [attrDic setObject:(__bridge id)ctFont forKey:(NSString *) kCTFontAttributeName];
  [attrDic setObject:(__bridge id)[UIColor blueColor].CGColor forKey:(NSString *)kCTForegroundColorAttributeName];
  [attrDic setObject:@((int)kCTUnderlineStyleSingle) forKey:(NSString *)kCTUnderlineStyleAttributeName];
  NSMutableAttributedString *linkedText=[[NSMutableAttributedString alloc]initWithString:string attributes:attrDic];
  CGMutablePathRef path=CGPathCreateMutable();
  CTFramesetterRef framesetter=CTFramesetterCreateWithAttributedString((__bridge CFMutableAttributedStringRef)linkedText);;
  CGPathAddRect(path,NULL,self.bounds);
  ctFrame=CTFramesetterCreateFrame(framesetter,CFRangeMake(0,[linkedText length]),path,NULL);
  CFArrayRef lines=CTFrameGetLines(ctFrame);
  for(int i=0;i<CFArrayGetCount(lines);i++){
   CGPoint orig;CGFloat ascent,descent,leading,width;
   CTFrameGetLineOrigins(ctFrame,CFRangeMake(i,1),&orig);
   width=CTLineGetTypographicBounds(CFArrayGetValueAtIndex(lines,i),&ascent,&descent,&leading);
   UIImageView *blank=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"img_black"]];
   [blank setFrame:CGRectMake(0,self.bounds.size.height-orig.y-ascent+descent,width,ascent+descent)];blank.alpha=0;
   self.userInteractionEnabled=YES;blank.userInteractionEnabled=YES;
   UITapGestureRecognizer *st=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(openPage:)];
   st.numberOfTapsRequired=1;
   [blank addGestureRecognizer:st];
   [self addSubview:blank];
  }
  CGPathRelease(path);
  self.backgroundColor=[UIColor clearColor];
    }
    return self;
}
-(void)openPage:(UITapGestureRecognizer *)gesture{
 openPage=[[OpenPage alloc]initWithURL:url];
 [self.superview.superview.superview addSubview:openPage.view];
}

・audio_url
ここまで来たらaudioもリンクじゃなくて直接再生したくなって一度挫折してるけどもっかい調べてみたらなんか行けそうな記事があったので再挑戦中。ただmp3のURLからストリーミングさせるのが結構大変そう。ちょっとがんばる。

0 件のコメント:

コメントを投稿