0

ここに画像の説明を入力 スクロール ビューを使用して動的なボタンとラベルを作成しています。そのための自動レイアウトを設定します。複数の動的ボタンを設定できる方法.i多くのチュートリアルを検索しますが、自動レイアウトの複数の動的ボタンを設定する例はありません. しかし、私はそのショーの正しい結果を検索していますが、自動レイアウトは機能しません。何の問題

   -(void)DynamicButton:(NSMutableArray*)objectName
    {
     for(UIView *view in [scrollView subviews])
      {
        [view removeFromSuperview];
      }
      int yPossion = 100, xPossion = 44; int temp = 0;


      for (int i = 0; i<[objectName count]; i++)
     {
    SMSCategory *cat = [objectName objectAtIndex:i];

    UIButton *aButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [aButton setTag:i];
    [aButton setTranslatesAutoresizingMaskIntoConstraints:YES];
    [aButton setBackgroundColor:[UIColor blackColor]];
    [aButton setBackgroundImage:[UIImage imageNamed:@"icon-menu.png"]  
    forState:UIControlStateNormal];

    [aButton setTitle:[NSString stringWithFormat:@"%d",i] 
    forState:UIControlStateNormal];

    [aButton setFrame:CGRectMake(xPossion, yPossion, 70, 60)];
     aButton.highlighted=YES;

    [scrollView addSubview:aButton];

    ;

    xPossion += aButton.frame.size.width+35;
    temp++;
    if (temp==3)
    {
        yPossion = aButton.frame.origin.y+aButton.frame.size.height+20;
        temp = 0;
        xPossion = 44;
        yPossion += aButton.frame.size.width-15;
        [scrollView setContentSize:CGSizeMake(scrollView.frame.size.width ,yPossion-
       50)];
    }

    UILabel *label =  [[UILabel alloc] init];
    [label setTranslatesAutoresizingMaskIntoConstraints:YES];

    [label setText:cat.Name];
    [label setTextColor:[UIColor blackColor]];
    label.font = [UIFont systemFontOfSize:12];

    [label sizeToFit];

    [label setFrame:CGRectMake(4, 44, 70, 60)];
    [scrollView addSubview:label];
    [aButton addSubview:label];

   }
   }

   //Autolayout code 
   [aButton setTranslatesAutoresizingMaskIntoConstraints:NO];
    NSDictionary *viewsDictionary = @{@"aButton":aButton};

    // 2. Define the button Sizes
    NSArray *aButton_constraint_H = [NSLayoutConstraint 
                                     constraintsWithVisualFormat:@"V:[aButton(60)]"
                                                                        options:0
                                                                        metrics:nil
                                                                         views:viewsDictionary];

    NSArray *aButton_constraint_V = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[aButton(70)]"
                                                                        options:0
                                                                        metrics:nil
                                                                          views:viewsDictionary];
    [aButton addConstraints:aButton_constraint_H];
    [aButton addConstraints:aButton_constraint_V];


    // 3. Define the views Positions using options
     NSArray *constraint_POS_V = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-80-[aButton]"
                                                                        options:0
                                                                        metrics:nil
                                                                        views:viewsDictionary];

     NSArray *constraint_POS = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[aButton]"
                                                                       options:0
                                                                       metrics:nil views:viewsDictionary];

    [self.view addConstraints:constraint_POS_V];
    [self.view addConstraints:constraint_POS];


}
4

2 に答える 2

1

searchBar コードの場合と同様に、プログラムで制約を追加する必要があります。理解もせずにどこかからそのコードをコピーしただけですか?

これには、 https ://medium.com/@jsleeuw/mastering-programmatic-auto-layout-b02ed2499d79 など、多くのチュートリアルがあります

次のようなものを使用して、すべての autoLayout 制約を作成する必要があります。

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:label
                                                      attribute:NSLayoutAttributeCenterX
                                                      relatedBy:NSLayoutRelationEqual
                                                         toItem:self.view
                                                      attribute:NSLayoutAttributeCenterX
                                                     multiplier:1.0
                                                       constant:0.0]];

コードに既にサンプルがある視覚的な形式もあります。

また、質問を編集してテキストをクリーンアップし、コードをフォーマットして読みやすいようにしました。人々があなたのコードを読みやすくするために行った変更に注意してください。

于 2014-10-16T15:07:21.737 に答える
0

autolayout では、ほとんどの場合に 4 つのことを設定する必要があります (場合によっては、そのうちの 1 つがコンテキストによって推測されます)。

  1. X 座標
  2. Y 座標
  3. 身長

コードを見ると、この行があります...

    [aButton setFrame:CGRectMake(xPossion, yPossion, 70, 60)];

以前に提案されたことは、完全に間違っているわけではありません。これらの制約は、まさに上記の行が意味するものです。問題は、スーパービューが幅と高さを定義するために、ボタンをスーパービューに固定する必要があることです。この場合、scrollView の contenSize を定義します。

したがって、疑似コードでは、次のようなことを行う必要があります

for each button
aButton.translatesAutoresizingMaskIntoConstraints = NO;
NSDictionary *viewsDictionary = @{@"aButton":aButton};
// 2. Define the button width and height
NSArray *aButton_constraint_H = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[aButton(60)]"
                                                                options:0
                                                                    metrics:nil
                                                                     views:viewsDictionary];

NSArray *aButton_constraint_V = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[aButton(70)]"
                                                                    options:0
                                                                    metrics:nil
                                                                      views:viewsDictionary];
[aButton addConstraints:aButton_constraint_H];
[aButton addConstraints:aButton_constraint_V];

その後、少なくとも最初のボタンを左、上に固定し、最後のボタンを右、下に固定する必要があります。各面のようなもの(例は上面のみ)

NSLayoutConstraint *top = [NSLayoutConstraint constraintWithItem:abutton
                                                                     attribute:NSLayoutAttributeTop
                                                                        relatedBy:NSLayoutRelationEqual
                                                                           toItem:self.scrollView
                                                                        attribute:NSLayoutAttributeTop
                                                                       multiplier:1
                                                                         constant:0];

それが役に立てば幸い!!

于 2016-04-26T23:33:37.413 に答える