【问题标题】:Buttons in ScrollView not enabledScrollView 中的按钮未启用
【发布时间】:2011-05-26 12:00:17
【问题描述】:

使用 Erica Sadun 的滚动视图示例,我创建了一个项目。 我现在在我的项目中有一个滚动视图和一个页面控件。 我为每个页面创建一个新视图并将其添加到我的滚动视图中,如下所示。 每个视图都有 5 个按钮,所以我可以滚动 5 x 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.我不认为你会在第二页上得到任何东西,因为你的 menuView.frame.origin.x 总是0 3. 你需要为你的按钮触摸事件添加目标
  • @7KV7:未启用是指当我触摸按钮时图像不会改变。
  • @rptwsthi:我现在实现了选择器。它仍然不起作用。但即使我没有实现选择器,当我触摸它时它应该仍然突出显示。采取的行动与它的外观无关。因为它是一个按钮,所以它应该已经具有在我触摸时突出显示的功能。对吗?

标签: iphone uiscrollview uibutton uipagecontrol


【解决方案1】:

触摸时更改图像

[menuButton setImage:menuImage2 forState:UIControlStateHighlighted];

还要确保你有 menubutton.showTouchOnHighlight = YES;

menuButton.adjustImageWhenHighlighted = YES;

也许 scrollView 会接受触摸事件。试试这些

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

【讨论】:

  • 抱歉,即使您不添加单独的图像以突出显示或启用,这些按钮也默认带有一个。
【解决方案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)];

所以原因与我添加到滚动视图的视图框架的位置有关。当滚动视图与分页一起使用时,似乎会出现此问题。当页面发生变化时,请确保滚动视图中的视图也移动到同一帧。

【讨论】:

    【解决方案3】:

    请在您的滚动视图中实现此代码

        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 不应被释放。它来自`[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.pngmenuimageselected.png 的两张图片是否存在。

          【讨论】:

          • 对不起,但这对按钮的工作没有任何作用。它只会改变按钮的位置。这与我的问题无关
          • 相同的代码对我来说工作正常,它通过更改两个图像验证了 jsut
          • 试试这个 [menuButton setImage:menuImage2 forState:UIControlStateHighlighted];
          【解决方案7】:
          1. 我会在“for”括号内声明“J”。

          2. 您正在保留 UIButton,然后释放它。你也不需要这样做,因为你没有分配它。

          3. 你不应该释放“menuImage”。

          4. 您正在将“menuImage2”分配给 UIButton 的选定状态。它应该是 UIControlStateHighlighted。

          编辑:

          不要这样做:

           [menuImage release];
           [menuButton release];
          

          也试试这个:

          - (void) menuButtonClicked: (id) sender { UIButton *btn = (UIButton *)sender; NSLog(@"点击了 %d",[btn 标签]); }

          【讨论】:

          • 查看我更新的代码,这些在按钮不响应触摸时并不重要..
          • 其实很重要。试试“for (int j = 0; j
          • 我明白了。但它仍然不适用于所有按钮。但仅适用于第一页上的那些。当您在 menuButtonClicked 函数中添加这些行时,您将看到。 - (IBAction) menuButtonClicked: (id) sender { UIButton *btn = sender; NSLog(@"点击了 %d",[发送者标签]); }
          • 也应该像这样改变标签:menuButton.tag = j + 5 * i;
          • 你能用新代码更新你的帖子吗?我以为你在使用选择器。尝试 -(void)menuButtonClicked:(id)sender 而不是 IBAction,因为您是在运行时创建按钮。
          猜你喜欢
          • 2018-02-25
          • 2016-05-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-01
          • 2021-01-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多