使用UIView或覆盖UIButton制作自定义按钮?

7 iphone objective-c

我需要通过代码生成一个自定义按钮,这就是我目前正在做的事情.

-(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)

有人能给我一些指示吗?我现在很沮丧.一直在阅读一些与按钮相关的其他各种线程,但没有什么能够清楚地说明如何解决这个问题

Fel*_*Cat 6

就个人而言,我会将UIButton子类化.尽管所有人都不能将UIButton作为子类,但Apple甚至在UIButton文档中讨论了UIButton的子类化.

在子类中,我将创建一个带有两个标签(或图像或其他)的UIView,并将它们作为子视图添加到按钮中(确保将文本和视图的交互设置为FALSE).

令人敬畏的是它利用UIButton代码并防止您重新发明轮子.

  • 对于那些没有打扰的人,请与cocoa-dev@lists.apple.com订阅,因为那里有很多知识渊博的人.尽管有许多谣言(也就是它们),UIButton**可以被分类.我不确定为什么**错误**信息被提升,正确的信息被打倒.如果你认为它不能被分类,**提供证据**.我和其他许多人已经将UIButton子类化了多年. (3认同)

Eik*_*iko 2

你不应该(我几乎说你不能) subclass UIButton,因为它是一个类簇,并且从中派生是不切实际的(读:不可能)。

所以你的两个选择是:

1)使用UIButton自定义类型的标准,添加您想要显示的元素(即UILabel)并连接触摸和触摸的操作并做出相应的反应(更改视图,触发操作等)

2) 使用自定义工具UIViewdrawRect:绘制您喜欢的方式或使用自定义视图作为子视图,如 1) 中所示。然后使用touchesBegan:touchesEnded:消息做出相应反应(或者UIGestureRecognizer如果您可以接受 3.2+ 兼容性)。

如果这些按钮都非常相似,您可以构建一个工厂来构建这些按钮,以便您的代码变得干净且不重复。

根据 iOS 6 进行编辑: Apple 现在在 UIButton 文档中提到了子类化,因此虽然仍然没有很好地定义,但现在这样做似乎相当安全。

  • @FeloneousCat 你可以在 ObjC 中做*许多*你不应该做的事情。从技术上讲这是可能的——毫无疑问。它有效。但由于 UIButton 没有指定的初始值设定项,并且无法设置其 type 属性(它是 *readonly*),因此无法正确配置子类。实例化按钮的唯一有记录的方法是通过其工厂方法 (+buttonWithType:)。所以是的,它有效。现在可以了。它将编译。明天还能用吗?周三可以上班吗?我们只是无法判断。这就是为什么这是不好的做法。 (2认同)