0

毎回3行を入力しなくても、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に配置できるものすべてに対してこれを修正するにはどうすればよいですか?

4

4 に答える 4

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

于 2013-03-27T01:07:18.277 に答える
0

LabelはUIControlのサブクラスではありません。UIControlの代わりにUIViewを使用できます。

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
于 2013-03-27T01:09:59.017 に答える
0

そして、解決しようとしている実際の問題に対処するために、この一連のヘルパーを使用することを強くお勧めしますhttps://github.com/kreeger/BDKGeometry

于 2013-03-27T01:36:34.440 に答える
0

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の幅と高さは、NSIntegerではなくCGFloatで(正しく)表されます。とにかくCGSizeの代わりに幅+高さを渡すのはなぜですか?

  5. 状態が不要な場合は、クラスメソッドを使用してみてください。+あなたの友だちです。あらゆる小さなことに対してインスタンスを起動しないでください(ObjCコードで見られるほとんどのシングルトンメソッドはクラスメソッドとしてリファクタリングする必要があります)。

ささいなことを気にしないプログラマーは、保守不可能なコード、つまり、それらを遅くするコードと、それらの後に続くコードに行き着きます。慣習とスタイルは、まともなサイズのプロジェクトでは非常に重要です。

于 2013-03-27T02:20:53.273 に答える