2010-11-20 2 views
3

Я изменил пример Apple Scrolling, чтобы захватить серию изображений, созданных из файлов, на которые ссылаются объекты CoreData. Я могу добавить изображения в порядке, но я также хочу программно добавить UIButton к каждому изображению. Количество изображений зависит от количества объектов CoreData, поэтому я не могу использовать IB.Программно добавляя UIButtons и UIImages к UIScrollview

Может ли кто-нибудь мне помочь, как бы я лучше всего это реализовал?

Вот код, который захватывает изображения из CoreData магазина:

NSUInteger i; 
for (i = 1; i <= kNumImages; i++) 
{ 
    Sentence *testSentence = [[managedObjectContext executeFetchRequest:request error:&error] objectAtIndex:i]; 

    NSArray *paths  = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *imageName = [[paths objectAtIndex:0] stringByAppendingPathComponent:[testSentence image]]; 
    NSLog(@"imageName: %@", imageName); 

    UIImage *image = [[UIImage alloc] initWithContentsOfFile:imageName]; 
    NSLog(@"image: %@", image); 

    UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 
    NSLog(@"imageView: %@", imageView); 

    [imageView setContentMode:UIViewContentModeScaleAspectFit]; 
    [imageView setBackgroundColor:[UIColor blackColor]]; 

    // setup each frame to a default height and width, it will be properly placed when we call "updateScrollList" 
    CGRect rect = imageView.frame; 
    rect.size.height = kScrollObjHeight; 
    rect.size.width = kScrollObjWidth; 
    imageView.frame = rect; 
    imageView.tag = i; // tag our images for later use when we place them in serial fashion 
    [scrollView1 addSubview:imageView]; 

    [image release]; 
    [imageView release]; 
} 

[self layoutScrollImages]; // now place the photos in serial layout within the scrollview 

А вот код, который устанавливает изображения из в Scrollview:

- (void)layoutScrollImages 
{ 
UIImageView *view = nil; 
NSArray *subviews = [scrollView1 subviews]; 

// reposition all image subviews in a horizontal serial fashion 
CGFloat curXLoc = 0; 
for (view in subviews) 
{ 
    if ([view isKindOfClass:[UIImageView class]] && view.tag > 0) 
    { 
     CGRect frame = view.frame; 
     frame.origin = CGPointMake(curXLoc, 0); 
     view.frame = frame; 

     curXLoc += (kScrollObjWidth); 
    } 
} 

// set the content size so it can be scrollable 
[scrollView1 setContentSize:CGSizeMake((kNumImages * kScrollObjWidth), [scrollView1 bounds].size.height)]; 
} 

ответ

1

Не уверен, что я понимаю вашу проблему. Не могли бы вы просто сделать это?

... 
imageView.frame = rect; 
UIButton *aButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
aButton.frame = imageView.frame; 
[aButton addTarget:self action:@selector(whatever:) forControlEvents:UIControlEventTouchUpInside]; 
[imageView addSubview:aButton]; 
+0

Спасибо за ваш ответ. Yup, который работает, но я не могу нажать на кнопку (он неуклонно игнорирует мои клики/нажатия), да, я изменил действие), и я хочу, чтобы кнопка была не того же размера, что и imageView.frame. Есть идеи? – glenstorey

+0

Вы, вероятно, имеете в виду 'aButton.frame = imageView.bounds', хотя в этом случае я не думаю, что это имеет большое значение. Вам также может потребоваться установить imageView.userInteractionEnabled = YES (по умолчанию NO для UIImageView, IIRC). –

+0

Сортировка размера кнопки/изображения рамки - но я не могу заставить его щелкнуть. Я пробовал: [aButton setUserInteractionEnabled: YES]; [aButton setEnabled: YES]; [aButton setAlpha: 1]; , и я не могу ничего сделать. Есть ли способ отладить то, что вы нажимаете? Какие-нибудь стратегии для работы? – glenstorey

1

Я была такая же проблема, когда я создавал галерею изображений и кнопки я добавил к каждой миниатюре не буду реагировать на события TouchUpInside.

Мне удалось заставить его работать, создав пользовательский подкласс UIView для хранения каждого отдельного изображения и реализации touchhesBegan: withEvent: и touchesEnded: withEvent: в этом подклассе.

См. UIScrollView programming guide для примера кода.

Если вы не позволяете масштабировать UIScrollView, вы можете упростить код, считая, что каждый сенсорный конец является событием с одним касанием.

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