Я использую UIScrollView для хранения различного количества изображений размером 80x80, и когда пользователь нажимает на одно, я хочу, чтобы он запускался в модальном представлении, показывая его в полноэкранном режиме и т. Д.
У меня проблема с обнаружением касаний изображений внутри прокрутки. Пока я пробовал два способа, но у каждого есть проблема. Я пишу обоими способами, но мне нужен только ответ на один из них.
У меня есть массив изображений, и я перебираю его, это первый метод, который я попробовал использовать UIImageView для каждого:
for (i=0; i<[imageArray count]; i++) {
// get the image
UIImage *theImage = [imageArray objectAtIndex:i];
// figure out the size for scaled down version
float aspectRatio = maxImageHeight / theImage.size.height;
float thumbWidth = theImage.size.width * aspectRatio;
float thumbHeight = maxImageHeight;
lastX = lastX+10;
// Scale the image down
UIImage *thisImage = [theImage imageByScalingProportionallyToSize:CGSizeMake(thumbWidth, thumbHeight)];
// Create an 80x80 UIImageView to hold the image, positioned 10px from edge of the previous one
UIImageView *image = [[UIImageView alloc] initWithFrame:CGRectMake(lastX, 10, 80, 80)];
image.clipsToBounds = YES;
image.contentMode = UIViewContentModeTopLeft;
image.image = thisImage;
image.userInteractionEnabled = YES;
// add to the scroller
[photoScroller addSubview:image];
// release
[image release];
// set variables ready for the next one
//lastWidth = thisImage.size.width;
lastWidth = 80; // we're using square images so set to 80 rather than the width of the image
lastX = lastX+lastWidth;
}
Проблема, которую это вызывает, состоит в том, что после этого цикла я должен установить для userInteractionEnabled значение NO в UIScrollView, чтобы я мог переопределить touchesBegan и обнаруживать касания, но при этом, конечно, отключается прокрутка, поэтому пользователь может видеть только первые 6 изображений .
Можно ли как-нибудь включить прокрутку, так сказать? photoScroller.scrollEnabled = YES; не действует, так как взаимодействие с пользователем было отключено.
...
Второй способ, которым я пытался использовать UIButton для каждого изображения, код для цикла в этом случае выглядит следующим образом:
for (i=0; i<[imageArray count]; i++) {
// get the image
UIImage *theImage = [imageArray objectAtIndex:i];
// figure out the size for scaled down version
float aspectRatio = maxImageHeight / theImage.size.height;
float thumbWidth = theImage.size.width * aspectRatio;
float thumbHeight = maxImageHeight;
lastX = lastX+10;
// Scale the image down
UIImage *thisImage = [theImage imageByScalingProportionallyToSize:CGSizeMake(thumbWidth, thumbHeight)];
// Create an 80x80 UIButton to hold the image, positioned 10px from the edge of the previous one
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(lastX, 10, 80, 80)];
button.clipsToBounds = YES;
button.contentMode = UIViewContentModeTopLeft;
[button setImage:thisImage forState:UIControlStateNormal];
[button setImage:thisImage forState:UIControlStateHighlighted];
[button addTarget:self action:@selector(tapImage:) forControlEvents:UIControlEventTouchUpInside];
// add to the scroller;
[photoScroller addSubview:button];
// release
[button release];
// set variables ready for the next one
//lastWidth = thisImage.size.width;
lastWidth = 80; // we're using square images so set to 80 rather than the width of the image
lastX = lastX+lastWidth;
}
Теперь этот код работает почти идеально, единственная проблема заключается в том, что пользователь может прокручивать его только в том случае, если он коснется пробела.
Есть ли способ, которым я могу сделать так, чтобы, если пользователь перетаскивает UIButton, он все еще прокручивал UIScrollView?