Проблема при использовании UIImageView или UIButton внутри UIScrollView - PullRequest
2 голосов
/ 23 августа 2010

Я использую 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?

Ответы [ 3 ]

2 голосов
/ 23 августа 2010

UIScrollView имеет свойство под названием delaysContentTouches. По умолчанию это YES, что приводит к желаемому поведению: перетаскивание всегда работает, даже если вы нажмете, например, UIButton.

Итак, если вы не видите такого поведения, возможно, вы установили delaysContentTouches на NO?

Кроме того, вместо использования UIImageView s в виде прокрутки и переопределения их touchedBegan: и друзей, вероятно, намного проще просто использовать UIButton s вместо.

Вы можете просто установить изображение кнопки на то, что вы хотите, и вам не нужно подкласс их. Просто используйте addTarget:, чтобы кнопки вызывали обратный вызов вашего viewcontroller при нажатии. (Это аналогично подключению к IBAction с помощью Interface Builder)

0 голосов
/ 01 декабря 2010

В прошлом у меня были некоторые проблемы с использованием кнопок в пользовательских представлениях, добавленных в представление с прокруткой.Кажется, @selectors не отвечают вообще.Чтобы быть более конкретным, я создавал постраничное представление прокрутки с UIView, встроенным с uiwebview и некоторыми кнопками.Я закончил тем, что удалил кнопки из встроенного представления и поместил их в родительский контроллер.Теперь я могу получать сенсорные события - я предполагаю, что между uiscrollview и uiwebview была какая-то странная группа сенсорных событий.

0 голосов
/ 10 октября 2010

В конце концов, оказалось, что это не проблема, я использовал UIButton s на случай, если кому-то интересно, все работает, как и ожидалось, и так, как я хотел.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...