2012-02-15 3 views
0

Я попытался добавить отражение в свою icarousel. Во-первых, мой код был таким, и это работало.добавление отражения в iCarousel

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index  reusingView:(UIView *)view 
{ 
UIButton* button = (UIButton *)view; 
if (button == nil) 
{ 
    //no button available to recycle, so create new one 
    UIImage *image = [arrKitapKapaklari objectAtIndex:index]; 
    button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    button.frame = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height); 
    [button setTitleColor:[UIColor clearColor] forState:UIControlStateNormal]; 
    [button setBackgroundImage:image forState:UIControlStateNormal]; 
    button.titleLabel.font = [button.titleLabel.font fontWithSize:50]; 
    [button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside]; 
} 


//set button label 
[button setTitle:[NSString stringWithFormat:@"%i", index] forState:UIControlStateNormal]; 

return button; 

}

После изменения, мой код стал так: появляется

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(ReflectionView *)view 
{ 


UIButton* button = nil; 
if (button == nil) 
{ 

    view = [[[ReflectionView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 150.0f, 200.0f)] autorelease]; 
    //no button available to recycle, so create new one 
    UIImage *image = [arrKitapKapaklari objectAtIndex:index]; 
    button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    button.frame = CGRectMake(0.0f, 0.0f, image.size.width, image.size.height); 
    [button setTitleColor:[UIColor clearColor] forState:UIControlStateNormal]; 
    [button setBackgroundImage:image forState:UIControlStateNormal]; 
    button.titleLabel.font = [button.titleLabel.font fontWithSize:50]; 
    [button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside]; 
     [view addSubview:button]; 
} 



//set button label 
[button setTitle:[NSString stringWithFormat:@"%i", index] forState:UIControlStateNormal]; 
[view update]; 
return view; 

}

Reflection. Но проблема в том, что я перемещаю вид карусели, изображения не течет правильно. Иногда появляется другой вид карусели.

Есть ли у вас какие-либо идеи о причинах этого?

+0

Почему вы устанавливаете 'button = nil;' перед тем, как «if (button == nil)»? Вы никогда не будете запускать код в этом блоке. –

+0

На самом деле он * всегда * собирается запустить его, но он все еще не прав - см. Мой ответ ниже. –

+2

Я женщина :) –

ответ

0

Я использую изображения с отражением встроенным в них ... не нужно делать что-либо в коде таким образом ..: р

+0

, но дело в том, что я получаю изображения с веб-службы. поэтому я не знаю, как заполнять динамические образы с отражением –

+0

тогда кажется разумным .. –

1

Код должен быть:

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(ReflectionView *)view 
{ 


UIButton* button = nil; 
if (view == nil) 
{ 
     //no view available to recycle, so create new one 
    view = [[[ReflectionView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 150.0f, 200.0f)] autorelease]; 

    button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    button.frame = view.bounds; 
    [button setTitleColor:[UIColor clearColor] forState:UIControlStateNormal]; 
    button.titleLabel.font = [button.titleLabel.font fontWithSize:50]; 
    [button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside]; 
      button.tag = 99; 
     [view addSubview:button]; 
} 
else 
{ 
    button = (UIButton *)[view viewWithTag:99]; 
} 

//set button label 
[button setTitle:[NSString stringWithFormat:@"%i", index] forState:UIControlStateNormal]; 

UIImage *image = [arrKitapKapaklari objectAtIndex:index]; 
[button setBackgroundImage:image forState:UIControlStateNormal]; 

[view update]; 
return view; 
} 
+0

жаль, что он не сработал. может быть, я должен четко объяснить. во-первых, я добавляю изображения в массив, называемый arrKitapKapaklari. И затем я заменяю их изображениями, которые я получаю из веб-сервиса. И проблема есть. у изображений есть тени, когда они текут. Если я не создаю представление отражения, он работает правильно. Но мне нужно размышление. Я думаю, проблема возникает, когда она пытается добавить subview. Это похоже на двойной взгляд. И я сожалею о моем страшном английском. Спасибо. –

+0

Я обновил свой ответ. Я не думаю, что вы поняли весь механизм повторного использования. Он работает как табличный вид - все в части if (view == nil) происходит только один раз, поэтому все, что нужно обновлять каждый раз, когда отображается представление, должно выйти за пределы оператора if. Основная задача загрузки - отдельная проблема. –

0

Я нашел ошибку. Я загружаю изображения здесь: - (void) getImagesWithThread { NSAutoreleasePool * pool; pool = [[NSAutoreleasePool alloc] init];

//for(int i=0;i<bookCount;i++){ 
for(int i=0;i<bookCount;i++){ 

    NSData * imageData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString:  [arrBookImages objectAtIndex:i]]]; 
    UIImage *image = [[UIImage imageWithData: imageData] retain]; 

    image = [self scaleToSize:CGSizeMake(140, 200) withImage:image]; 

    if(image!=nil) [arrBookImages replaceObjectAtIndex:i withObject:image]; 



    [image release]; } 

[carousel reloadData];

[у бассейна];

} Когда я выполнил это в фоновом режиме, он не перезагрузился правильно. Если я выполняю нормально, он работает. Но я хочу загрузить их в поток. Я имею в виду, прежде всего, я хочу установить изображения и заменить их изображениями из url. но я хочу, чтобы они появлялись один за другим. Есть ли у вас какие-либо идеи?

+1

Да, когда вы загрузили новое изображение, вам необходимо обновить соответствующий элемент в карусели. Я предлагаю называть [carousel reloaditemAtIndex: анимированные:] каждый раз, когда вы загружаете изображение в фоновом режиме. Убедитесь, что вы вызываете это в основном потоке, хотя из-за того, что обновлять пользовательский интерфейс в фоновом потоке небезопасно. Вы можете использовать performSelectorOnMainThread для вызова обновлений в основном потоке из потока backgroun. Я добавлю пример загрузки фона в следующую версию iCarousel, так как это общий вопрос. –

Смежные вопросы