1

UILabelオブジェクトが画面上を移動するアプリを作成しています。私の質問は、ラベルが特定の境界を越えるように制限する方法です。たとえば、ラベルにメッセージが含まれている場合、メッセージの最初の部分だけでなく、メッセージ全体を表示したいと思います。これはコードです:

#define kHeight     320.0
#define kWidth          400.0
#define kTransitionDuration 1.50
#define kTopPlacement       80.0

- (void)myMover {


for (UIView *view in self.view.subviews) {
      if( [view isKindOfClass:[UILabel class]]){
    [UIView animateWithDuration:4.0 animations:^{  

            //set the point from where the move will start
            [self setRandomLocationForLabel:view];

        }];
    }

}

}


- (void) setRandomLocationForView:(UIView *)view
 {
  [view sizeToFit];      
   CGRect messageViewBounds = CGRectMake(round((self.view.bounds.size.width - kWidth) / 2.0),
                          200, kWidth, kHeight);

CGRect newFrame = CGRectMake( 0, 300, 100 , 20 );
while (view.frame.size.width > kWidth) {

    newFrame.size.width /= 2;
    newFrame.size.height /= 2;

}


view.frame = newFrame;

CGFloat x = (CGFloat) (arc4random() % (int) messageViewBounds.size.width + view.frame.size.width/2);
CGFloat y = (CGFloat) (arc4random() % (int) messageViewBounds.size.height + view.frame.size.height/2);


view.center = CGPointMake (x,y);

}

アドバイスありがとうございます!

4

2 に答える 2

1

ビューがあるので、そのサイズを知っています。幅を知ることで、ビューの中心を左または右からどれだけ離す必要があるかがわかります (幅の半分)。高さを知ることで、上か下か (高さの半分) がわかります。

これで、ビュー全体を取得して、ビューの幅の半分を左右両方で差し引き、ビューの高さの半分を両方の上で差し引いた挿入長方形を作成することにより、そのビューの有効な中心点のみを含む長方形を計算できます。そして底。

CGSize viewSize = view.bounds.size; // The view you are positioning
CGRect rectOfValidCenters = CGRectInset(self.view.bounds, // The view you are placing it in
                                        viewSize.width/2.0, // subtract the width/2 from left and right  
                                        viewSize.height/2.0); // subtract the height/2 form top and bottom
CGFloat randomX = // generate random value from 0.0 to 1.0
CGFloat randomY = // generate random value from 0.0 to 1.0

// Random valid center point is: 
//  ( minX + randomX * width , minY + randomY * height)
//
// if x and y are zero then the view's center will be in the upper left
// of the rect of valid centers (making its upper left corner be in the
// top left of the view it's placed in).
// if x and y are one then the view's center will be in the lower right
// of the rect of valid centers (making its lower right corner be in the
// lower right of the view it's placed in).
CGPoint randomValidPoint = CGPointMake(CGRectGetMinX(rectOfValidCenters) + randomX * CGRectGetWidth(rectOfValidCenters),
                                       CGRectGetMinY(rectOfValidCenters) + randomY * CGRectGetHeight(rectOfValidCenters));
view.center = randomValidPoint;
于 2012-10-26T21:02:29.993 に答える
1

私の質問は、ラベルが特定の境界を越えるように制限する方法です。たとえば、ラベルにメッセージがある場合、メッセージの最初の部分だけでなく、メッセージ全体を表示したいと考えています。

ラベルが着地するランダムな位置を決定する際には、ラベルの長さ/幅と高さを考慮する必要があります。そのため、ランダムな選択は次の領域に着陸する必要があります

CGSize labelSize = [messageString sizeWithFont:messageString.font 
                             constrainedToSize:maximumLabelSize 
                                 lineBreakMode:messageString.lineBreakMode];

CGFloat minX = 0;
CGFloat minY = 0;
CGFloat maxX = self.view.frame.size.width - labelSize.width;
CGFloat maxY = self.view.frame.size.height - labelSize.height;

// Use minX/Y and maxX/Y in your random co-ordinate algorithm
于 2012-10-26T20:42:55.640 に答える