2

4つのエッジすべてのすべてのコーナーと中央に8つのサブビューを持つ1つの対角UIViewを作成しました。

すべての赤い点はドラッグして菱形のサイズを変更できます。

すべてのサブビューは、対角UIViewで1回追加されます。画像Screen1を参照してください。 ここに画像の説明を入力してください

ダイアモンドビューのパスフレームは必要ないので、中央と赤い点のフレームで管理できます。Autoresizemaskで管理する必要があるので、増減しながらすべての時間枠を通過する必要はありません。

ひし形の赤い点を作成するためのコードは次のとおりです。

 view4 = [[CustomDotRD alloc] initWithFrame:CGRectMake(self.frame.size.width - self.frame.size.width/4 - RED_W_H_RD/2, self.frame.size.height - self.frame.size.height/4 - RED_W_H_RD/2, RED_W_H_RD, RED_W_H_RD)];
        view4.backgroundColor = [UIColor clearColor];
        UIPanGestureRecognizer *panGestureDiamond = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(singleFingerTapsDiamond:)];
        [view4 addGestureRecognizer:panGestureDiamond];
        [panGestureDiamond release];
        [view4 setContextPropertyColor:RGB_RED contextFrame:CGRectMake(RED_W_H/2, RED_W_H/2, RED_W_H, RED_W_H) index:4 tag:kTAG_D4];
        view4.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
        view4.center = CGPointMake(self.frame.size.width - self.frame.size.width/4, self.frame.size.height - self.frame.size.height/4);
        [self addSubview:view4];
        [self.boundDiamondArray addObject:view4];

ここでは、菱形を増やしながらいくつかの画像を投稿しました。いくつかの赤い点は奇妙な動作をします。

Screen2に表示されるすべての赤い点のすべての自動サイズ変更マスクのリストは次のとおりです。

1 - BottomMargin , LeftMargin , RightMargin
2 - TopMargin , BottomMargin , LeftMargin , RightMargin
3 - TopMargin , BottomMargin , LeftMargin 
4 - TopMargin , BottomMargin , LeftMargin , RightMargin
5 - TopMargin , LeftMargin , RightMargin
6 - TopMargin , BottomMargin , LeftMargin , RightMargin
7 - TopMargin , BottomMargin , RightMargin
8 - TopMargin , BottomMargin , LeftMargin , RightMargin

ここに画像の説明を入力してください

4つの角の赤い点は正常に機能していますが、4つの中央の端の赤い点は完全には機能していません。いくつかの画面を表示できます。

ここに画像の説明を入力してください ここに画像の説明を入力してください

この問題を解決するためのあなたのアイデアを教えてください。

AutoresizeMaskで管理するフレームやセンターを通過させたくないことを忘れないでください。。

AutoresizeMaskLinkを理解するのに役立つリンク

よろしく、

4

1 に答える 1

2

赤い点の高さのために、エッジの中央にある点のtopMargin / bottomMargin比が正確に3ではないため、自動サイズ変更は正しく機能しません。幅と高さがゼロのドットがある場合は、正しく配置されます。

メソッドを実装layoutSubviewsすることは、あなたのタスクにとってより良い解決策になると思います。

本当にこれを解決したい場合は、のみを使用してautoresizingMaskください。サイズがゼロのビュー内に各赤い点を配置し、ダイヤモンドビュー内にサイズゼロのビューを追加する必要があります。提供したコードの代わりに、以下のコードを使用してください。ドットはダイヤモンドの直接のサブビューではなくなったため、他のパーツにいくつかの変更を加える必要がある場合があります。

view4 = [[CustomDotRD alloc] initWithFrame:CGRectMake(-RED_W_H_RD/2, -RED_W_H_RD/2, RED_W_H_RD, RED_W_H_RD)];
view4.backgroundColor = [UIColor clearColor];
UIPanGestureRecognizer *panGestureDiamond = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(singleFingerTapsDiamond:)];
[view4 addGestureRecognizer:panGestureDiamond];
[panGestureDiamond release];
[view4 setContextPropertyColor:RGB_RED contextFrame:CGRectMake(RED_W_H/2, RED_W_H/2, RED_W_H, RED_W_H) index:4 tag:kTAG_D4];
UIView* dotView4 = [[CustomView alloc] initWithFrame:CGRectZero];
dotView4.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
dotView4.center = CGPointMake(self.frame.size.width - self.frame.size.width/4, self.frame.size.height - self.frame.size.height/4);
[dotView4 addSubview:view4];
[self addSubview:dotView4];
[dotView4 release];
[self.boundDiamondArray addObject:view4];

タッチイベントの問題を修正するには、クラス内pointInside:withEvent:のメソッドをオーバーライドする必要があります。次のコードは、タッチポイントがビューの境界外にある場合でも、タッチイベントがサブビューに到達することを確認します。UIViewCustomView

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{
  for(UIView* aView in self.subviews){
    CGPoint localPoint = [self convertPoint:point toView:aView];
    if([aView pointInside:localPoint withEvent:event]){
      return YES;
    }
  }
  return NO;
}
于 2012-08-31T14:27:55.850 に答える