【问题标题】:Trying to set UIControl objects' frames through a function尝试通过函数设置 UIControl 对象的框架
【发布时间】:2013-03-27 10:20:53
【问题描述】:

我正在尝试创建一个函数来更改诸如 UILabel 或 UIButton 之类的大小,而不必每次都输入三行。这就是我所拥有的。

-(void)setObject:(UIControl*)object SizeWidth:(NSInteger)width Height:(NSInteger)height
{
    CGRect labelFrame = object.frame;
    labelFrame.size = CGSizeMake(width, height);
    object.frame = labelFrame;
}

但是,当我给 (UIControl*)object 一个 UILabel 时,它会显示“不兼容的指针类型”。我该如何解决这个问题以适用于我可以放在 UIView 上的任何东西?

【问题讨论】:

  • 一些风格问题。遵循 Obj-C 风格约定可以让其他人更有效地阅读和理解我们的代码。 1. 所有方法参数都应以小写字符开头。 2. set 用作@property 综合的一部分,按照惯例,您的方法名称表示将名为object 的属性设置为object 的值,然后设置它的宽度和高度。 3. Objective-C 中的大多数东西都是一个对象......当你清楚地使用视图时,你有一个名为setObject: 的方法? 4. 可以传递CGSize,为什么还要传递width和height?
  • 我在这方面还是有点新意,但我一定会记住这些。谢谢!
  • 没问题。我认为@aeubanks,这就是我试图提供帮助的原因。努力做到最好是 Stack Overflow 的重点。

标签: objective-c xcode


【解决方案1】:

UILabel 不是UIControl 的子类,它继承自UIView

尝试将UIControl 更改为UIView

-(void)setObject:(UIView*)object SizeWidth:(NSInteger)width Height:(NSInteger)height
{
    CGRect labelFrame = object.frame;
    labelFrame.size = CGSizeMake(width, height);
    object.frame = labelFrame;
}

(无论如何,UIControl 继承自 UIViewframeUIView 属性)

【讨论】:

    【解决方案2】:

    标签不是 UIControl 的子类。您可以使用 UIView 代替 UIControl。

    Here is the hierarchy for UILabel  
    UILabel: UIView : UIResponder : NSObject
    
    -(void)setObject:(UIView*)object SizeWidth:(NSInteger)width Height:(NSInteger)height
    {
        CGRect labelFrame = object.frame;
        labelFrame.size = CGSizeMake(width, height);
        object.frame = labelFrame;
    }
    

    给你的一个建议是,方法名称对我来说似乎有点奇怪。您可以编写一个简单的类别来更新 UIView 的大小。使用以下类别,您可以简单地调用

    [myLabel setWidth:20 andHeight:20];
    

    在 UIView + MyCategory.h

    #import <UIKit/UIKit.h>
    
    @interface UIView (MyCategory)
    
    - (void)setWidth:(NSInteger)aWidth andHeight:(NSInteger)aHeight;
    
    @end
    

    在 UIView + MyCategory.m

    #import "UIView + MyCategory.h"
    @implementation UIView (MyCategory)
    
    - (void)setWidth:(NSInteger)aWidth andHeight:(NSInteger)aHeight;
    {
        CGRect frameToUpdate = self.frame;
        frameToUpdate.size = CGSizeMake(aWidth, aHeight);
        self.frame = frameToUpdate;
    }
    
    @end
    

    【讨论】:

    • 我对 MyCategory.h 是什么感到困惑。但是你的方式看起来非常非常简单,我绝对想实现它。谢谢!
    • 没关系,我查了一下,现在就知道了。非常感谢
    【解决方案3】:

    为了解决您要解决的实际问题,我强烈建议使用这组帮助程序https://github.com/kreeger/BDKGeometry

    【讨论】:

      【解决方案4】:

      遵循 Obj-C 风格约定(为工作选择正确的工具)可以让其他人更有效地阅读和理解我们的代码。这里的 Objective-C 风格需要一些清理。如果您有兴趣,请参阅源代码后的我的注释。以更简洁的方式执行此操作:

      你可以走类方法路线(也许在视图操作类中)

      @implementation CCViewGeometry
      
      + (void)adjustView:(UIView *)view toSize:(CGSize)size
      {
          CGRect frame = view.frame;
          frame.size = size;
          view.frame = frame;
      }
      
      @end
      

      或 UIView 类别路由

      @implementation UIView (CCGeometry)
      
      - (void)resize:(CGSize)size
      {
          CGRect frame = self.frame;
          frame.size = size;
          self.frame = frame;
      }
      
      @end
      

      与本页代码相关的样式注释:

      1. 所有方法参数应以小写字符开头。

      2. setFoo: 用于@property 合成中,按照惯例,您的方法名称表示将名为object 的属性设置为object 的值。您正在设置大小,而不是对象本身。

      3. 要明确。当您知道要传递的对象的一般类型时,为什么还要有一个名为 setObject: 的方法?

      4. UIKit 中的宽度和高度(正确地)由 CGFloat 表示,而不是 NSInteger。为什么要传递 width + height 而不是 CGSize?

      5. 在不需要状态时尝试使用类方法。 + 是你的朋友。不要为每一件小事都启动实例(我在 ObjC 代码中看到的大多数单例方法都应该重构为类方法)。

      不关心小事的程序员最终会编写无法维护的代码——这些代码会拖慢他们的速度,也会拖慢他们的速度。惯例和风格对于任何体面的项目都很重要。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-19
        • 2021-06-14
        • 2012-04-29
        • 2013-06-09
        • 2021-03-17
        • 1970-01-01
        相关资源
        最近更新 更多