0

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

A B C D

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

A   C D 

或这个:

A     D

iOS 5 中有没有办法(不能使用AutoLayout)(除了使用大量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 回答