我在屏幕上有 4 个对象:(UIView 或 UIButton)
A B C D
在某些情况下,我需要隐藏其中的一个或多个,这会导致:
A C D
或这个:
A D
iOS 5 中有没有办法(不能使用AutoLayout
)(除了使用大量if并以编程方式设置位置)来修剪空格并强制上面的示例看起来像这样:
A C D
A D
我在屏幕上有 4 个对象:(UIView 或 UIButton)
A B C D
在某些情况下,我需要隐藏其中的一个或多个,这会导致:
A C D
或这个:
A D
iOS 5 中有没有办法(不能使用AutoLayout
)(除了使用大量if并以编程方式设置位置)来修剪空格并强制上面的示例看起来像这样:
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;
}
}
}
}
第 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;
}
}