Кнопки в ScrollView не включены

#iphone #uiscrollview #uibutton #uipagecontrol

#iPhone #uiscrollview #uibutton #uipagecontrol

Вопрос:

Используя пример просмотра прокрутки Эрики Садун, я создал проект. Теперь у меня есть вид прокрутки и элемент управления страницей в моем проекте. Я создаю новый вид для каждой страницы и добавляю его в свой вид прокрутки, как показано ниже. В каждом представлении есть 5 кнопок, поэтому я могу прокручивать 5 на 5. Однако кнопки, похоже, не включены. Есть идеи, почему?

     // Create the scroll view and set its content size and delegate
    sv = [[[UIScrollView alloc] initWithFrame:CGRectMake(0.0f, 200.0f, 300.0f, 60.0f)] autorelease];
    sv.contentSize = CGSizeMake(NPAGES * 300.0f, sv.frame.size.height);
    sv.pagingEnabled = YES;
    sv.delegate = self;


    // Load in all the pages
    for (int i = 0; i < NPAGES; i  )
    {
        UIView *menuView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 300.0f, 60.0f)];


    for (int j = 0; j < 5 * (i 1); j  )
        {
            UIImage *menuImage = [UIImage imageNamed:@"menuimage.png"];
            UIImage *menuImage2 = [UIImage imageNamed:@"menuimageselected.png"];
UIButton *menuButton = [[UIButton buttonWithType:UIButtonTypeCustom] retain];

            menuButton.frame = CGRectMake(j * 60.0f, 0.0f, 60.0f, 60.0f);
            [menuButton addTarget:self action:@selector(menuButtonClicked) forControlEvents:UIControlEventTouchUpInside];


        menuButton.tag = j   5 * i;

            menuButton.backgroundColor = [UIColor clearColor];
            [menuButton setImage:menuImage forState:UIControlStateNormal];
            [menuButton setImage:menuImage2 forState:UIControlStateSelected];
            [menuButton setImage:menuImage2 forState:UIControlStateHighlighted];
            [menuButton setEnabled:YES];


            [menuImage release];
            [menuButton release];
            [menuView addSubview:menuButton];

        }

        [sv addSubview:menuView];
        [sv bringSubviewToFront:menuView];

        [menuView release];

    }

    [self.view addSubview:sv];
  

Комментарии:

1. Как вы говорите, что они не включены?

2. Здесь вы не внедрили никакого селектора, так как же вы можете сказать, что кнопка не включена? И снова, пожалуйста, уточните, что на самом деле вы хотите сделать.

3. в этом коде так много ошибок 1. никогда не пытайтесь сохранить кнопку 2. Я не думаю, что вы получите что-либо на своей второй странице, потому что ваш MenuView.frame.origin.x всегда равен 0 3. вам нужно добавить цель для вашего события нажатия кнопки

4. @7KV7: не включено, я имею в виду, что изображение не меняется, когда я касаюсь кнопки.

5. @rptwsthi: теперь я внедрил селектор. это все еще не работает. но даже если бы я не реализовал селектор, он все равно должен был подсвечиваться, когда я касался его. предпринятое действие не связано с тем, как оно выглядит. поскольку это кнопка, у нее уже должна быть функциональность для выделения при касании. верно?

Ответ №1:

Чтобы изменить изображение при касании, используйте

 [menuButton setImage:menuImage2 forState:UIControlStateHighlighted];
  

Также убедитесь, что у вас есть menubutton.showTouchOnHighlight = YES; и

 menuButton.adjustImageWhenHighlighted = YES;
  

Возможно, ScrollView принимает события касания. Попробуйте эти

 scrollView.delaysContentTouches = NO;
scrollView.canCancelContentTouches = NO;
  

Комментарии:

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

Ответ №2:

Я решил эту проблему, изменив рамку представления, которое я добавляю к своему виду прокрутки. Итак, вместо этой строки:

 UIView *menuView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 300.0f, 60.0f)];
  

Теперь я заставляю представление менять свой фрейм каждый раз, когда меняю страницу:

 UIView *menuView = [[UIView alloc] initWithFrame:CGRectMake(i * 300.0f, 0.0f, 300.0f, 60.0f)];
  

Таким образом, причина была связана с расположением рамки вида, который я добавлял к виду прокрутки. Эта проблема, по-видимому, возникает, когда вид прокрутки используется вместе с подкачкой. Когда страница изменится, убедитесь, что вид внутри scrollview также перемещается в тот же фрейм.

Ответ №3:

Пожалуйста, внедрите этот код в свой ScrollView

     UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    btn.frame = CGRectMake(X, Y, Width, Height);
    btn.tag = //your tag Number;
    [btn addTarget:self action:@selector(showGameDetail:) forControlEvents:UIControlEventTouchUpInside];
  

И добавьте этот метод

  -(IBAction)showGameDetail:(id)sender
 {
    //Your Code
 }
  

Ответ №4:

  [menuImage release];
  

menuImage не должно быть release. Это происходит из `[UIImage imageNamed:], и это автоматически выпущенный объект. Это приведет к перезапуску изображения.

Ответ №5:

Просто попробуйте это, и я не уверен, сработает ли это в вашем случае.

  [scrollView bringSubviewToFront:button];
  

Ответ №6:

попробуйте этот код

 for (int i = 0; i < NPAGES; i  )
{
    UIView *menuView = [[[UIView alloc] initWithFrame:CGRectMake(i * 300.0f, 0.0f, 300.0f, 60.0f)] autorelease];

    for (j = 0; j < 5 ; j  )
    {
        UIImage *menuImage = [UIImage imageNamed:@"menuimage.png"];
        UIImage *menuImage2 = [UIImage imageNamed:@"menuimageselected.png"];
        UIButton *menuButton = [UIButton buttonWithType:UIButtonTypeCustom];
        menuButton.frame = CGRectMake(j * 60.0f, 0.0f, 60.0f, 60.0f);
        menuButton.backgroundColor = [UIColor clearColor];
        [menuButton setImage:menuImage forState:UIControlStateNormal];
        [menuButton setImage:menuImage2 forState:UIControlStateHighlighted];
        [menuButton setEnabled:YES];
        [menuButton addTarget:self action:@selector(someSelector)  forControlEvents:UIControlEventTouchUpInside];

        [menuView addSubview:menuButton];
    }

    [sv addSubview:menuView];
}
  

и, пожалуйста, убедитесь, что два изображения с именами menuimage.png и menuimageselected.png присутствуют.

Комментарии:

1. извините, но это ничего не делает для работы кнопки. меняется только то, где будут находиться кнопки. это не связано с моим вопросом

2. тот же код отлично работает со мной, его просто проверили, изменив два изображения

3. попробуйте это [Меню настройки кнопки:menuImage2 для состояния:UIControlStateHighlighted];

Ответ №7:

  1. Я бы объявил «J» внутри круглых скобок «for».

  2. Вы сохраняете UIButton, а затем отпускаете его. Вам не нужно делать ни того, ни другого, потому что вы не выделяете его.

  3. Вы не должны выпускать «menuImage».

  4. Вы присваиваете «menuImage2» выбранному состоянию UIButton. Это должно быть UIControlStateHighlighted.

Редактировать:

Не делайте этого:

  [menuImage release];
 [menuButton release];
  

Также попробуйте это:

- (недействительно) menuButtonClicked: (идентификатор) отправителя {

 UIButton *btn = (UIButton *)отправитель;
 NSLog(@"нажал %d", [тег btn]);
}

Комментарии:

1. Смотрите код, который я обновил, на самом деле это не имеет значения, если кнопка не реагирует на касания..

2. На самом деле это важно. попробуйте «for (int j = 0; j < 5 * (i 1); j )» и убедитесь сами.

3. Я вижу. Но все равно это работает не для всех кнопок. но только для тех, что на первой странице. когда вы добавите эти строки в функцию menuButtonClicked, вы увидите. — (IBAction) menuButtonClicked: (id) отправитель { UIButton *btn = отправитель; NSLog(@»нажал %d», [тег отправителя]); }

4. также следует изменить тег следующим образом: MenuButton.tag = j 5 * i;

5. Можете ли вы обновить свой пост с помощью нового кода. Я думал, вы используете селектор. попробуйте -(void)menuButtonClicked: (id) отправитель не IBAction, поскольку вы создаете кнопки во время выполнения.