2012-09-18 47 views
1

我想创建一组可以工作并且非常像Metro-style tiles that are available on Windows Phones的按钮。我想允许用户点击他们访问他们的底层功能(打开模式或其他类型)。继承UIButton以创建自定义按钮的任何一点?

  1. 我担心子类化UIButton不会让我那里。我需要瓷砖本身的方形角和动态内容。我发现的帖子似乎暗示了subclassing a UIButton would not be a good idea有几个原因,我应该改用UIView。 该回复来自2010年,我不知道在2年以后,如何实现这种效果有了相当大的变化。如果不是很快,大多数用户将拥有iOS 5.1+。

  2. 比方说,我确实去了UIView路线。我是否应该实现UIResponder的触摸事件,还是应该使用UITapGestureRecognizer路线? 2012年有什么更好的做法?

谢谢!

回答

1

我建议从UIControl而不是UIButton继承。我已经看到了这些窗口切片在一些视频中的外观和工作方式,包括内容变化时翻动动画等,并且将该功能打包到类中或类似的东西比在任何地方携带修改后的UIButton更容易,它适用于您需要创建的每个此类实例。

我建议不要从UIButton继承的原因是因为它支持1张图片和1张标签。您似乎在所有图块上都有多个图片和标签,因此您必须开始管理自己的子视图。您不需要在UIButton中获得1标签和图像,而是从UIControl开始从头开始创建瓷砖。

+0

非常有趣,感谢您的回应!你会如何推荐我处理我在第2点提到的触摸事件? –

+0

UIControl是UIButton的父类,并且已经能够处理触摸事件。您可以通过调用选择器'addTarget:action:forControlEvents:' – Anurag

+0

为UIControl对象添加修饰处理程序,您是否相信在这种特定情况下使用UITapGestureRecognizer会有什么好处? –

0

如果你只是想要有正方形的metro风格的按钮,就像常规按钮一样(推动它们并发生某些事情),那么你可以使用自定义按钮而不需要子类化来获得标准UIButton类的所有功能。

这是一个快速的例子,在代码中,但这也可以在IB中完成。 说你有一个名为图像:tile1.png

//set the image 
UIImage *image = [UIImage imageNamed:@"tile1.jpg"]; 

//create the button 
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 

//add the image 
[button setImage:image forState:UIControlStateNormal]; 

//define the action 
[button addTarget:self action:@selector(buttonTouched:) forControlEvents:UIControlEventTouchUpInside]; 

如果您需要修改框的大小,您可以通过button.frame 您还可以修改其他一些按钮的属性。

你是否知道这一切,并寻找其他的东西或有帮助? 好吧

+0

您还可以根据状态添加多个图像[button setImage:image forState:XXX],您已选择,突出显示,禁用等。 – andres83

0

用例是在Storyboard/Interface Builder中使用自定义按钮。拥有一个子类允许你从Interface Builder直接使用这个自定义按钮。