【问题标题】:UIButton in UITableViewCellUITableViewCell 中的 UIButton
【发布时间】:2011-05-18 22:24:00
【问题描述】:

我在 UITableViewCell 中有一个带有图像的 UIButton。当单元格被突出显示时,按钮也进入突出显示状态(即图像的较暗阴影),无论用户是否在按钮的范围内单击。

我不想要此功能 - 我只希望在单击按钮时突出显示该按钮,而不是在单击整个单元格时突出显示。

我尝试将处于突出显示状态的图像设置为与普通图像相同。这解决了问题,但它会阻止按钮在真正突出显示时改变颜色。

有什么想法可以达到预期的效果吗?

【问题讨论】:

    标签: iphone uitableview uibutton


    【解决方案1】:

    这让我发疯了。我发现您需要覆盖 setHighlighted:animated:setSelected:animated:

    - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
        [super setHighlighted:highlighted animated:animated];
        self.yourButton.highlighted = NO;
    }
    
    - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
        [super setSelected:selected animated:animated];
        self.yourButton.selected = NO;
        // If you don't set highlighted to NO in this method,
        // for some reason it'll be highlighed while the 
        // table cell selection animates out
        self.yourButton.highlighted = NO;
    }
    

    【讨论】:

    • 我今天遇到了这个问题并使用了这种方法,但是在点击单元格时它使按钮闪烁。我通过在每个方法的开头将 showTouchWhenHighlighted 设置为 NO 并在最后返回 YES 来解决此问题。
    • @Zemm 非常棒。我已经看过几次了,但一直无法修复它
    【解决方案2】:

    codecaffeine 的建议对我不起作用(iOS 8.3),但它确实让我走上了正轨。我这样修改它(虽然它在 Swift 中):

    override func setHighlighted(highlighted: Bool, animated: Bool) {
        var colorBefore = self.myButton.backgroundColor
        super.setHighlighted(highlighted, animated: animated)
        self.myButton.highlighted = false
        self.myButton.backgroundColor = colorBefore
    }
    

    【讨论】:

      【解决方案3】:

      为了让它工作,我不得不在 UITableViewCell 上使用以下子类。 'button' 对象是自定义单元格内的按钮:

      - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {
          [self.button setShowsTouchWhenHighlighted:NO];
          [super setHighlighted:highlighted animated:animated];
      
          self.button.highlighted = NO;
          [self.button setShowsTouchWhenHighlighted:YES];
      }
      
      - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
          [self.button setShowsTouchWhenHighlighted:NO];
          [super setSelected:selected animated:animated];
          self.button.highlighted = NO;
      
          // Configure the view for the selected state
          [self.button setShowsTouchWhenHighlighted:YES];
      }
      

      将不同的行颠倒可能会导致按钮突出显示。

      【讨论】:

        【解决方案4】:

        我使用了一种不同的方法,它更容易一些,我希望它对你有用。只需在上述两个委托方法中将按钮的高亮状态设置为 false:

        -(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath {
            UIButton *btnAction = (UIButton *) [[tableView cellForRowAtIndexPath:indexPath] viewWithTag:3];
            btnAction.highlighted = NO;
        }
        
        
        -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
            UIButton *btnAction = (UIButton *) [[tableView cellForRowAtIndexPath:indexPath] viewWithTag:3];
            btnAction.highlighted = NO;
        }
        

        【讨论】:

          【解决方案5】:

          一种方法是在选择表格视图单元格时“取消选择”或“取消突出显示”按钮:

          - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
          {
            [yourButton setHighlighted:NO];
            // do something cool
          }
          

          【讨论】:

          • 这是我的第一个想法,但这仅适用于单元格选择,不适用于单元格突出显示(触地事件)
          【解决方案6】:

          一种可能的解决方法是,将单元格选择样式设置为无。在这种情况下,当您选择单元格时,它不会突出显示。

          这只是可能的解决方法。可能是你有其他的想法。

          【讨论】:

          • 这就是需要发生的事情。如果 selectionStyle 状态不是 None ,即使将子控件的高亮和选定状态设置为 NO 似乎也没有任何作用。
          【解决方案7】:

          实际上并没有尝试过,但是您是否可以为 UIControlEventTouchDown 按钮添加一个目标/动作,将其突出显示状态图像更新为您想要的,然后为 UIControlEventTouchUpInside / UIControlEventTouchUpOutside / UIControlEventTouchCancel 添加另一个目标/动作来重置突出显示的图像以匹配正常状态的图像?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多