1

UIActivityIndi​​catorViewのクラスカテゴリを作成しようとしています-画面中央に設定したいと思います。

だから私は宣言しました:

@implementation UIActivityIndicatorView(Normalize)

-(UIActivityIndicatorView *) setAtScreenCenter{
    CGRect r = [UIScreen mainScreen].applicationFrame;
    CGRect wheelR = CGRectMake(r.size.width / 2 - 12, r.size.height / 2 - 12, 24, 24);
    self = [[UIActivityIndicatorView alloc] initWithFrame:wheelR];
    self.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
    self.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |
                                      UIViewAutoresizingFlexibleRightMargin |
                                      UIViewAutoresizingFlexibleTopMargin |
                                      UIViewAutoresizingFlexibleBottomMargin);
    return self;
}
@end

使用法:[activityWheel setAtScreenCenter];

ただし、コンパイルエラーが発生します。

Cannot assign to 'self' outside of a method in the init family
4

3 に答える 3

3

あなたsetAtScreenCenterはインスタンスメッセージです。既存のに送信する必要がありますUIActivityIndicatorView。なぜこの方法で新しい ものを作成しようとするのですか?UIActivityIndicatorView

代わりにこれを試してください:

self.frame = wheelR;

また、座標がどのように機能するかについてかなり混乱しているかもしれません。ビューのフレームは、スーパービューの座標系を基準にしています。画面の座標系とは関係ありません。スーパービューが全画面表示の場合でも、その座標系は、1つの方向を除くすべての点で画面の座標系とは異なります。次のように座標を変換できます。

CGRect frame = [UIScreen mainScreen].applicationFrame;
CGPoint p = CGPointMake(CGRectGetMidX(frame), CGRectGetMidY(frame));
p = [self.window convertPoint:p fromWindow:nil]; // convert screen -> window
p = [self.superview convertPoint:p fromView:nil]; // convert window -> my superview
self.center = p;
于 2012-12-20T09:42:11.593 に答える
2

警告は単なる衒学以上のものであり、コンパイラは実際にあなたをあなた自身から救っています。自分自身に割り当てようとするのではなく、返す新しいUIActivityIndi​​cator変数を宣言する必要があります。メソッドのより良いバージョンは次のようになります。

+(UIActivityIndicatorView *)setAtScreenCenter{
    CGRect r = [UIScreen mainScreen].applicationFrame;
    CGRect wheelR = CGRectMake(r.size.width / 2 - 12, r.size.height / 2 - 12, 24, 24);
    UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithFrame:wheelR];
    indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
    indicator.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |
                                  UIViewAutoresizingFlexibleRightMargin |
                                  UIViewAutoresizingFlexibleTopMargin |
                                  UIViewAutoresizingFlexibleBottomMargin);
    return indicator;
}

クラスメソッドとして、selfへの割り当てを処理する必要がなくなり、メソッドの戻り型を満たすことが常に保証されます(これが真の初期化子である場合、idサブクラス化を容易にするために戻ります)。

于 2012-12-20T09:41:26.740 に答える
1

これは実際にはinitメソッドではありません。したがって、ここで自分自身に割り当てる必要はありません。その行をスキップして、メソッドをvoidメソッド(戻り値なし)にします。

@implementation UIActivityIndicatorView(Normalize)

-(void) setAtScreenCenter{
    CGRect r = [UIScreen mainScreen].applicationFrame;
    CGRect wheelR = CGRectMake(r.size.width / 2 - 12, r.size.height / 2 - 12, 24, 24);
    self.frame = wheelR;
    self.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
    self.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |
                                      UIViewAutoresizingFlexibleRightMargin |
                                      UIViewAutoresizingFlexibleTopMargin |
                                      UIViewAutoresizingFlexibleBottomMargin);

}
@end

これで、既存のUIActivityIndi​​catorViewで呼び出して、必要に応じてその位置を設定できます。

[activityWheel setAtScreenCenter];
于 2012-12-20T09:42:23.027 に答える