0

画面上に 4 つのオブジェクトがあります: (UIView または UIButton)

A B C D

場合によっては、次のような結果になる 1 つまたは複数を非表示にする必要があります。

A   C D 

またはこれ:

A     D

iOS 5 ( Can't useAutoLayout ) (多くのifを使用し、プログラムで場所を設定する以外に) スペースをトリミングし、上記の例を次のように強制する方法はありますか?

A C D
 A D
4

1 に答える 1

0

これを達成するためにKVOを使用しました。
ステップ 1:ViewControllerすべてのビューで隠しプロパティの変更のオブザーバーとして登録します。

[_view1 addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
[_view2 addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
[_view3 addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
[_view4 addObserver:self forKeyPath:@"hidden" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];

ステップ 2:変更通知に応答するメソッドを追加するViewController

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
  if(![object isEqual:[viewArray lastObject]]){
    UIView *viewToHide = (UIView *)object;
    CGRect newFrame = viewToHide.frame;
    CGRect oldFrame;
    int indexOfObject = [viewArray indexOfObject:object];
    for(int i = indexOfObject + 1; i < viewArray.count; i++){
      UIView *viewToChange = [viewArray objectAtIndex:i];
      if(viewToChange.hidden){
        continue;
      }
      else{
      oldFrame = viewToChange.frame;
      viewToChange.frame = newFrame;
      [viewArray replaceObjectAtIndex:i withObject:viewToChange];
      newFrame = oldFrame;
      }
    }
  }
}

ステップ 3:ビューをタップするとビューが非表示になります。もちろん、これはどのような方法でも実現できます。

- (IBAction)viewTapped :(UIGestureRecognizer *)recogniser{
  CGPoint touchPoint = [recogniser locationInView:self.view];
  UIView *touchView = [self.view hitTest:touchPoint withEvent:nil];
  if([touchView isKindOfClass:[UIView class]]){
    touchView.hidden = YES;
  }
}
于 2013-08-20T10:05:22.930 に答える