2011-05-08 18 views
23

Uitableview ve uitabbar'da bir iPhone uygulama tabanı oluşturuyorum. Tablo görünümündeki her hücrede "favoriye ekle" seçeneğim var. Bu düğmeye bastığımda, hücrenin konumunun en sevdiği öğeye (atlama sırasında indirme etkisi ile aynı) "atlama" yapmak istiyorum"Görünür" alandan veya pencereden UITableviewCell konumu alın

Etki, en iyi 10 hücreyeydim Ancak, tablo içinde kaydırırsanız, efekt iyi değildir çünkü başlangıç ​​konumu, kullanıcı boyutundan hesaplanır.

Görünen alandan bir hücrenin konumunu bilmek mümkün. ?

Örnek: Fortieth hücre konumu için x: 0, y: 1600, w: 320, y: 50, ekranın üst kısmındaki konumun uiview'in üstünden değil, bu gibi bir şey olmasını istiyorum. : 0, y: 230, a: 320, y: 50

cevap

75

Evet, rectForRowAtIndexPath: numaralı telefonu kullanabilirsiniz. Sadece dizini tıklamak zorundasınız.

rectForRowAtIndexPath:

endeksi yoluna göre belirlenen üst üste için çizim alanını döndürür.

...

DÜZENLEME

Dönüşüm:

CGRect rectInTableView = [tableView rectForRowAtIndexPath:indexPath]; 
CGRect rectInSuperview = [tableView convertRect:rectInTableView toView:[tableView superview]]; 
+0

x: 0, y: 1200 değerini döndür ve görüntünün en üstündeki konumu istiyorum (durum çubuğundan) böylece 20 ile yaklaşık 367 arasında olmalıdır (görünüm boyutu) – Mickael

+0

@Benja min Frolicher üzgünüm, cevabımı güncelledim, dönüşüm eksikti. –

+0

Teşekkürler Nick, yorumunuzdaki kod işe yarıyor! – Mickael

-1

Yani burada ben kullanılan kod: (Bu eminim optimize edilebilir):

Önce özel hücreye NSindexPath ** özelliğini ekleyin.
* sizin tableview denetleyicisi bu uygulayın: *

-(void)addCellToFavorisWithAnimation:(ResultSearchOffreCell*)cell{ 
/* Generate image from cell 
----------------------------------------------------------*/ 
UIGraphicsBeginImageContextWithOptions(cell.bounds.size, cell.opaque, [[UIScreen mainScreen] scale]); 
[cell.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

// Launch first animation (go to top-right) 
//----------------------------------------------------------*/ 
CGRect rectInTableView = [self.tableView rectForRowAtIndexPath:cell.indexPath]; 
CGRect rectInSuperview = [self.tableView convertRect:rectInTableView toView:[self.tableView superview]]; 

cellAnimationContainer = [[UIImageView alloc] initWithFrame:rectInSuperview]; 

[cellAnimationContainer setFrame:CGRectMake(cellAnimationContainer.frame.origin.x, cellAnimationContainer.frame.origin.y+50 , cellAnimationContainer.frame.size.width, cellAnimationContainer.frame.size.height)]; 

[cellAnimationContainer setImage:img]; 

AppDelegate_Shared *appDelegate = [UIApplication sharedApplication].delegate; 
[appDelegate.window addSubview:cellAnimationContainer]; 
[UIView beginAnimations:@"addFavorite-Step1" context:nil]; 
[UIView setAnimationDelegate:self]; 
[UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
[UIView setAnimationDuration:0.2]; 
[cellAnimationContainer setFrame:CGRectMake(20,cellAnimationContainer.frame.origin.y-10, cellAnimationContainer.frame.size.width, cellAnimationContainer.frame.size.height)]; 
[cellAnimationContainer setAlpha:0.7]; 
[UIView commitAnimations]; 
} 
-(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{ 


/* Launch second animation => go to favoris Tab and remove from self.view 
---------------------------------------------------------------------------*/ 
if([anim isEqual:@"addFavorite-Step1"]) 
{ 
    [UIView beginAnimations:@"addFavorite-Step2" context:nil]; 
    [UIView setAnimationCurve:UIViewAnimationCurveLinear]; 
    [UIView setAnimationDuration:0.3]; 
    [UIView setAnimationDelegate:self]; 
    [cellAnimationContainer setAlpha:0.4]; 
    [cellAnimationContainer setFrame:CGRectMake(150, 420, 20, 20)]; 
    [UIView commitAnimations]; 
} 
else if([anim isEqual:@"addFavorite-Step2"]) 
{ 
    [cellAnimationContainer removeFromSuperview]; 
    [cellAnimationContainer release];   
} 
} 
-1

Evet, bu size yardımcı olacaktır

-(void)click:(id)sender 
{ 
    int clickcelltag; 
    clickcelltag=sender.tag; 

    NSIndexPath *index =[NSIndexPath indexPathForRow:clickcelltag inSection:0]; 

    [userreviewtblview scrollToRowAtIndexPath:index atScrollPosition:UITableViewScrollPositionTop animated:YES];//userreviewtblview is a UITableView name 
} 

Hope gibi mümkündür :-) 20 hücre RectForRowAtIndexPath için