根据状态设置自定义 UIButton 样式

Posted

技术标签:

【中文标题】根据状态设置自定义 UIButton 样式【英文标题】:setting custom UIButton style according to its state 【发布时间】:2011-09-15 07:39:55 【问题描述】:

我正在我的程序中(不是在 IB 中)创建一个自定义 UIButton,我希望它在不同的状态下显示不同的图像,所以我做到了:

UIImage *learnImg=[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"01" ofType:@"png"]];
self.learn=[[UIButton buttonWithType:UIButtonTypeCustom] retain];
[self.learn setFrame:CGRectMake(148, 108,254,97)]; 
[[self.learn imageView] setContentMode:UIViewContentModeScaleAspectFit];
[self.learn setImage:learnImg forState:UIControlStateNormal];

UIImage *learnSelected=[UIImage imageWithContentsOfFile:[[NSBundle mainBundle]   pathForResource:@"02" ofType:@"png"]];
[self.learn setImage:learnSelected forState:UIControlEventTouchDown];

[self.learn addTarget:self action:@selector(loadLearn:) forControlEvents:UIControlEventTouchUpInside];

问题是,这两个图像的大小不同,所以当我点击按钮时,按钮的位置被“平移”(我相信这是由于“setFrame”行为,因为 xy 位置应该是相对的) .

我想不出解决这个问题的方法,我只想确保按钮在任何状态下都处于正确的位置。无论如何我可以为每个按钮设置一套完整的样式状态(帧、图像等)?还是有其他想法?

谢谢!

我终于通过两个动作事件重新设置按钮的中心来解决这个问题:UIControlEventTouchDown 和 UIControlEventTouchCancel。 谢谢大家的cmets。

【问题讨论】:

【参考方案1】:

UIControlEventTouchDown 不是按钮的状态。它是由按钮注册的事件。 UIButton 的各种状态是

enum 
    UIControlStateNormal       = 0,                       
    UIControlStateHighlighted  = 1 << 0,                  // used when UIControl isHighlighted is set
    UIControlStateDisabled     = 1 << 1,
    UIControlStateSelected     = 1 << 2,                  // flag usable by app (see below)
    UIControlStateApplication  = 0x00FF0000,              // additional flags available for application use
    UIControlStateReserved     = 0xFF000000               // flags reserved for internal framework use
;
typedef NSUInteger UIControlState;

【讨论】:

谢谢,但这是我遇到的另一个问题。当我将图像设置为“UIControlStateHighlighted”状态时,按钮永远不会更改为我设置的图像,即使我还包含了“UIControlStateSelected”。不知道发生了什么:S 尝试在按钮操作中使用button.selected = YES;相应地更改按钮的状态,看看它是否有效。【参考方案2】:

1.) 尝试使用setBackgroundImage:forState: 设置背景图像,这将拉伸您的图像以适合大小。如果您不想这样做,请尝试使用 imageEdgeInsets 属性。

2.) 您希望“ontouch”图像的状态是 UIControlStateHighlighted。如果你想做某事。自定义具有“选定”状态(selectedproperty),您需要使用状态组合(UIControlStateSelected|UIControlStateHighlighted for selected+ontouch)

【讨论】:

感谢您的评论。由于“UIViewContentModeScaleAspectFit”属性,图像的大小实际上已经完美地绘制在按钮上,而且当用户单击它时按钮“变大”也是我的意图。无论如何我可以将按钮的一个边缘固定到一个位置,并且每当它“增长”时就不会弄乱整个位置? 尝试设置按钮的center 并通过设置其边界使其更大。如果这还不够,你可以弄乱图层的anchorPoint 谢谢。我基本上尝试了一切,似乎没有任何工作。具体来说,图像是两个锥形几何形状,它们被转换以适应指定的空间。预期的结果是,当用户单击按钮时,第二个较大的圆锥与第一个重叠(它们的顶点保持在同一位置)。通过简单地使用框架/边界等来实现似乎太难了。猜猜最简单的方法是将更大的圆锥体创建为图像并控制其“隐藏”属性? >_ 【参考方案3】:
       UIButton *deleteButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [deleteButton setFrame:CGRectMake(285, 5, 30, 30)];
        deleteButton.contentMode = UIViewContentModeScaleAspectFill;     
        UIImage *newImage12 = [UIImage imageNamed:@"x.png"];
        deleteButton.tag = indexPath.row;
        [deleteButton setImage:newImage12 forState:UIControlStateNormal];
        [deleteButton setImage:newImage12 forState:UIControlStateHighlighted];
        [deleteButton addTarget:self action:@selector(deleteRemindersMethod:) forControlEvents:UIControlEventTouchUpInside];

根据您的按钮状态给出图像名称。

【讨论】:

以上是关于根据状态设置自定义 UIButton 样式的主要内容,如果未能解决你的问题,请参考以下文章

在自定义单元格 Swift 中保存 uibutton 状态

xcode UIButton创建监听按钮点击自定义按钮 状态 内边距

将自定义 UIButton 样式应用于所有按钮

自定义UIButton 实现图片和文字 之间距离和不同样式

如何使自定义 UIButton 变暗

uniapp顶部状态栏自定义设置