繁体   English   中英

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

[英]Making a custom Button using a UIView or overriding UIButton?

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

-(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;
    }
}

这将通过代码完美地创建空白按钮,为它们提供标记并在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

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

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

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

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

你不应该(我几乎不能说你不能) UIButton ,因为它原来是一个类集群,并且从那里得到它是不切实际的(读:不可能)。

所以你的两个选择是:

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

2)使用自定义UIView ,实现drawRect:绘制您喜欢的方式或使用自定义视图作为1)中的子视图。 然后使用touchesBegan:touchesEnded:等消息进行相应的反应(如果你能兼容3.2+,则使用UIGestureRecognizer )。

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

根据iOS 6进行编辑: Apple现在提到了UIButton文档中的子类化,所以虽然目前还没有很好地定义,但现在这样做似乎很安全。

一个简单的方法是覆盖UIView。 在视图中,您将UIButton添加为子视图。 这样,您就拥有了可重用的类,而无需重新实现按钮行为。

您可以在UIView派生类的initWithFrame方法中按照自己的方式设置按钮的样式。 如果您将此类用作按钮事件的目标,则可以轻松实现特殊行为,例如显示图像。

对于这两段文本,您可以创建两个标签,并将它们作为子视图添加到按钮中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM