【问题标题】:Change layout when objects are not visible对象不可见时更改布局
【发布时间】:2013-08-21 04:52:18
【问题描述】:

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

A B C D

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

A   C D 

或者这个:

A     D

iOS 5 中有没有办法(不能使用AutoLayout)(除了使用大量 ifs 并以编程方式设置位置)来修剪空间并强制上面的例子看起来像这样:

A C D
 A D

【问题讨论】:

  • 我想没有简单的方法。您需要编写代码来更改框架或变换。
  • 幸运的是,我只有 1-4 个对象要展示。如果我需要显示和隐藏大约 10 个对象怎么办?有很多如果。
  • 使用键值观察(KVO)。当视图被隐藏时,您将收到消息,因此您可以移动其他视图。在这种情况下,你不需要很多 ifs。

标签: ios objective-c cocoa-touch ios5


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多