0

フレームが外部で不変のUIViewのサブクラス(UIPickerView、UISwitchなど)を書きたいので、layoutSubviews、sizeToFit、setFrameをオーバーライドしようとしましたが、機能しません。
UIKit の UIPickerView や UISwitch のように実装する方法を知っている人、ありがとう。

アップデート:

- (void)setFrame:(CGRect)frame        
{
    [super setFrame:frame];
    self.frame = CGRectMake(0, 0, 200, 200);
}

_frame を使用してビューのフレームを設定できないため、これらを記述すると無限ループに陥ります。

4

2 に答える 2

2

self.frame = newFrameを呼び出すのと本質的に同じ[self setFrame:newFrame]です。そのため、無限ループに入ります。

ただし、次のようにすることもできます。

- (void)setFrame:(CGRect)frame        
{
    [super setFrame:CGRectMake(0, 0, 200, 200)];
}

これにより、アンカー ポイント (左上隅) が (0,0) に設定されることに注意してください。これは、意図したものではない可能性があります。代わりに使用setBounds:するか、オリジンをスーパーに渡します。

- (void)setFrame:(CGRect)frame        
{
    [super setFrame:CGRectMake(frame.origin.x, frame.origin.y, 200, 200)];
}
于 2012-07-15T14:43:23.940 に答える
2

オーバーライド-setBounds:して、ビューを特定の境界に制限します。

このようなものが動作するはずです:

static CGFloat maxHeight = ...;
static CGFloat maxWidth  = ...;

- (void)setBounds:(CGRect)bounds {
   CGSize size = bounds.size; 
   size.width = MIN(maxWidth, size.width);
   size.height = MIN(maxHeight, size.height);

   bounds.size = size;
   [super setBounds:bounds];
}
于 2012-07-15T14:28:06.060 に答える