2012-02-11 10 views
1

ユーザーはボタンをクリックできますCountryを追加するとCountry Pickerが表示され、Pickerからユーザーが選択したものはラベル/ボタンとして追加されます)をクリックします。これらの新しい削除ボタンをクリックすると、自分自身とそのラベルが削除されます。uibuttonを動的に追加し、下にある要素を下に移動してスペースを作る方法

私はすでに国ピッカーから値を取得し、私の問題は、ボタンがちょうど既存の要素の上に配置されている、ここでHow do I create a basic UIButton programmatically?

からのコードを使用してボタンを作成することができます。作成したボタンを[国を追加]ボタンまたは以前に作成したボタンの下に置いてください。以前は[国を追加]ボタンの下にあった要素はどれも下に移動する必要があります。

私はこの検索にどのような検索用語を使用すべきか分かりません。私はuitableviewを使用して新しく作成されたボタンを格納することを考えていましたが、それは何とか展開しますが、私はこれにも運がありませんでした。私は途中でストーリーボードを使用しています。

編集:

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
{ 
    // get text of selected option 
    NSString *pickedText; 
    if ([pickerView tag] == 201) { 
     pickedText = [arrCountries objectAtIndex:row]; 
    } 
    else if([pickerView tag] == 202) { 
     pickedText = [arrLanguages objectAtIndex:row]; 
    } 

    // create button 
    UIButton *countryButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [countryButton addTarget:self 
         action:@selector(removeCountry:) 
      forControlEvents:UIControlEventTouchUpInside]; 
    [countryButton setTitle:pickedText forState:UIControlStateNormal]; 
    countryButton.frame = CGRectMake(0, 210.0, 160.0, 40.0); 
    [self.view addSubview:countryButton]; 

    // hide picker 
    [countryPicker setHidden:YES]; 
    [languagePicker setHidden:YES]; 

} 

- (void)removeCountry:(UIButton *)countryButton 
{ 
    [countryButton removeFromSuperview]; 
} 

EDIT2:要素が以前に動的に追加されたボタンを除いて下降される更新されたコードの関連するコードを追加しました。

// create button 
    UIButton *countryButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [countryButton addTarget:self 
         action:@selector(removeCountry:) 
      forControlEvents:UIControlEventTouchUpInside]; 
    [countryButton setTitle:pickedText forState:UIControlStateNormal]; 

    CGRect newFrame = addCountryButton.frame; 
    newFrame.origin.y = newFrame.origin.y + addCountryButton.frame.size.height + countryButton.frame.size.height; 
    countryButton.frame = newFrame; 

    [self.view addSubview:countryButton]; 

    // move elements down 
    [elementsBelowAddCountry enumerateObjectsUsingBlock:^(id obj, BOOL *stop) { 
     CGRect newFrame = [obj frame]; 
     newFrame.origin.y = newFrame.origin.y + countryButton.frame.size.height; 
     [obj setFrame:newFrame]; 
     NSLog(@"object %@", obj); 

    }]; 

    [elementsBelowAddCountry setByAddingObject:countryButton]; 
    // this doesn't work. new countryButton is set on top of previous countryButton 

答えて

1

私はtableViewオプションも好きですが、きれいです。

Bの新しいサブビュー(countryButton)を含め、ストーリーボード内のビュー(A)の正確なコピー(B)を作成することができます。次に、ユーザーがAに国を追加することを選択すると、フェード(混乱しないプッシュ)でBに移行(セグ)します。メンテナンスの問題は、ビューAを更新するときはいつでも、Bを更新することを忘れないようにすることです。このオプションを使用すると、画面から何も移動しないように、必要に応じて行の間隔を変更することができます。

別の単一ビューの代替方法は、addCountryがクリックされた場合(viewDidLoadでリストを作成する)に移動したいすべてのアイテムのセットを維持することです。選択すると、enumerateObjectsUsingBlockでオブジェクトを列挙:このような何かを:countryButtonが削除された場合

CGRect newFrame = self.frame; 
newFrame.origin.y = newFrame.origin.y + countryButton.frame.size.height + 10; 
self.frame = newFrame; 

、yは減少を除いて同じことを行います。

2番目のオプションのようなものです。列挙型をアニメーションブロックに入れると、滑らかに見えるので、これも良いことです。

は、

ダミアン

+0

ありがとう、私は2番目のオプションを試しています。最初に追加されたボタンのために働いています。下の要素は下に移動しています。しかし、2番目に追加されたボタンの場合、それをセットに追加して、それも下に移動するにはどうすればよいですか?更新されたコードは私の質問です。 – Cekk

+0

私は簡単なことがあると思います:do elementsBelowAddCountry = [elementsBelowAddCountry setByAddingObject:countryButton];上記の方法でセットを変更することはありません。 –

+0

うん、それはそれ:) – Cekk

0
UIButton *yourOriginalButtom; 

UIButton *newButton = [[UIButton alloc] initWithFrame:yourFrame]; /* or use UIButton *newButton = [UIButton buttonWithType:UIButtonTypeCustom]; or UIButtonTypeRoundedRect */ 
newButton.center = CGPointMake(yourOriginalButtom.center.x, yourOriginalButtom.center.y+newButton.frame.size.height/2 + 15); 
[newButton setTitle:@"New button" forState:UIControlStateNormal]; 
newButton.backgroundColor = [UIColor whiteColor]; // this will only work on custom buttons 
[self.view addSubview:newButton]; 
+0

感謝をお楽しみいただけますが、このコードが唯一の削除ボタンがダウンするために働くようです。しかし、以前は[国の追加]ボタン(この場合は[言語を追加])の下にあった要素はどうですか。 – Cekk

0

私はあなたがこれを行うための二つの方法を提案することができます:最も簡単な方法は、その都度ユーザーは、あなたがのためにリロードを行う国を追加するように、テーブルビューでそれを追加することです

  1. をテーブルのデータはすぐにテーブルに表示され、テーブルビューは編集と削除の行機能をサポートしているので、このテーブルが好きです。

  2. 最後のコントロール(あなたの場合はラベル)のyポイントを保存して、次にユーザーが次のラベルのフレームであるべき場所を簡単に計算できるようにすることができます。

+0

テーブルビューを追加すると、実際に展開されますか?それはそれが含まれている行の数に関係なく、独自のサイズを維持するだろうか? – Cekk

関連する問題