有没有更简单的方法来移动iOS中的UI元素?

问题描述:

我发现自己这个做了很多:有没有更简单的方法来移动iOS中的UI元素?

webView.frame = CGRectMake(webView.frame.origin.x, otherView.frame.origin.y + otherView.frame.size.height + 10, webView.frame.size.width, webView.frame.size.height); 

显然很多这样的代码的重复。我只是移动元素,但我不得不创建一个新的CGRect,因为我无法直接访问属性。

有没有更简单的方法来移动我在运行时丢失的元素?

并不是一个完全不同的方式,但如果你问我一个更舒适的一个:

 
CGRect newRect = webView.frame; 
newRect.origin.y = otherView.frame.size.height+10; 
webView.frame = newRect; 

我觉得这是方式更具有可读性为好。在这个特定的例子中,它少了大约40%的字符! :p

@wasabii就减少代码量而言有正确的答案,但另一种考虑的方法是在UIView上创建一个类别。以下是一些有关类别的文档:http://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/Category.html

基本上,一个类别允许您向不控制的类(甚至是您控制的类)添加功能。

Xcode 4.2提供了一个用于在新文件对话框下创建类别的模板,因此如果可以的话,请使用该模板。

在这种情况下,你可能会创建的UIView类别与一种称为

-(void)moveDownByIncrement:(float)increment 

然后实现移动代码,只要你喜欢(但真正使用@ wasabii的方法)。

有几件事情要记住约类别:

  1. 它们影响的类本身,所以当你添加一个方法到一个类别是可用的应用广泛。
  2. 如果您尚未导入类别标题(将其导入到课堂或预处理中),则尝试调用类别方法时会出现错误(或警告,具体取决于您的项目设置)。
  3. 类别是使用可能导致冲突的名称空间定义的。避免这种情况的最好方法是将所添加的任何方法(以及类别名称本身)与项目特定的前缀相加。许多第三方库和开源项目在NSData上使用一个名为 - (NSString *)base64EncodedString的类别,因此您可以省去头痛,并将该方法作为您自己类别的前缀。
  4. 在一个类别上设置属性或ivars是最好的麻烦,值得讨论它自己。如果你不知道该怎么做,那就别试试了!

view.frame = CGRectOffset(view.frame, 5, 10);