Ios 当对象不可见时更改布局

Ios 当对象不可见时更改布局,ios,objective-c,cocoa-touch,ios5,Ios,Objective C,Cocoa Touch,Ios5,我在屏幕上有4个对象:(UIView或UIButton) 在某些情况下,我需要隐藏其中一个或多个,这将导致: A C D 或者这个: A D 在iOS 5中(不能使用自动布局)(除了使用大量的ifs并以编程方式设置位置之外)是否有办法修剪空间并强制上面的示例如下所示: A C D A D 我使用KVO实现了这一点。 步骤1:注册ViewController作为所有视图中隐藏属性更改的观察者 [_view1 addObserver:self forKeyPath:@"hidd

我在屏幕上有4个对象:(UIView或UIButton)

在某些情况下,我需要隐藏其中一个或多个,这将导致:

A   C D 
或者这个:

A     D
在iOS 5中(不能使用
自动布局
)(除了使用大量的ifs并以编程方式设置位置之外)是否有办法修剪空间并强制上面的示例如下所示:

A C D
 A D

我使用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;
      }
    }
  }
}

我想没有简单的办法。您需要编写代码来更改帧或变换。幸运的是,我只有1-4个对象要显示。如果我需要显示和隐藏大约10个对象,该怎么办?这是很多ifs。使用键值观察(KVO)。当一个视图被隐藏时,您将得到消息,因此您可以改变其他视图。在那种情况下,你不需要太多的“如果”。
- (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;
      }
    }
  }
}
- (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;
  }
}