我需要通过代码生成一个自定义按钮,这就是我目前正在做的事情.
-(void) initialiseButtons
{
int ypos = playerImage.frame.origin.y + playerImage.frame.size.height + 8;
for(int i=0; i<totalButtons; i++)
{
UIButton *newButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[newButton setFrame:CGRectMake(20, ypos, 220, 30)];
newButton.tag = 10 + i;
[newButton addTarget:self action:@selector(statTapped:) forControlEvents:UIControlEventTouchUpInside];
[self.frontView addSubview:newButton];
ypos += 30 + 7;
}
}
Run Code Online (Sandbox Code Playgroud)
这将通过代码完美地创建空白按钮,为它们提供标记并在touchUpInside上分配回调函数.
自定义按钮需要能够处理按下时显示图像.它需要能够绘制2个文本.1对齐于按钮的左侧,1对齐于按钮的右侧.
我的老板建议使用View而不是按钮.我不明白这是如何工作的.当我开始考虑它时,我认为它需要一个专用于按钮的viewcontroller.还有一些绘制方法?这听起来很复杂,我不知道如何做到这一点.
通过使自定义类重写UIButton,有更简单的方法吗?我之前做了一个简单的测试类,但当我使用它们代替Normal UIButton类时,按钮位置没有绘制任何内容.我预计我会看到buttonUp.png被绘制.
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface CardButton : UIButton {
}
@end
#import "CardButton.h"
#import <UIKit/UIKit.h>
@implementation CardButton
- (id)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame])
{
[self setImage:[UIImage imageNamed:@"buttonUp.png"] forStates:UIControlStateNormal];
self.adjustsImageWhenHighlighted = YES;
}
return self;
}
@end
Run Code Online (Sandbox Code Playgroud)
有人能给我一些指示吗?我现在很沮丧.一直在阅读一些与按钮相关的其他各种线程,但没有什么能够清楚地说明如何解决这个问题
就个人而言,我会将UIButton子类化.尽管所有人都不能将UIButton作为子类,但Apple甚至在UIButton文档中讨论了UIButton的子类化.
在子类中,我将创建一个带有两个标签(或图像或其他)的UIView,并将它们作为子视图添加到按钮中(确保将文本和视图的交互设置为FALSE).
令人敬畏的是它利用UIButton代码并防止您重新发明轮子.
你不应该(我几乎说你不能) subclass UIButton,因为它是一个类簇,并且从中派生是不切实际的(读:不可能)。
所以你的两个选择是:
1)使用UIButton自定义类型的标准,添加您想要显示的元素(即UILabel)并连接触摸和触摸的操作并做出相应的反应(更改视图,触发操作等)
2) 使用自定义工具UIView来drawRect:绘制您喜欢的方式或使用自定义视图作为子视图,如 1) 中所示。然后使用touchesBegan:等touchesEnded:消息做出相应反应(或者UIGestureRecognizer如果您可以接受 3.2+ 兼容性)。
如果这些按钮都非常相似,您可以构建一个工厂来构建这些按钮,以便您的代码变得干净且不重复。
根据 iOS 6 进行编辑: Apple 现在在 UIButton 文档中提到了子类化,因此虽然仍然没有很好地定义,但现在这样做似乎相当安全。