2014-03-14 22 views
2

我在简单的层次上获得框架/边界。仍试图向上移动到一个更高级的使用...我可以让我的UIView的框架与其祖父母相匹配吗?

我有,看起来像一个视图堆栈:

enter image description here

UICollectionViewCell实际上是我自己的子类。我已将它的selectionBackgroundView设置为股票UIView,并在选择时切换hidden属性。该容器视图包含一个或多个我自己的MyAnnotationView实例。他的目的是为细胞注释。但是他所做的大部分绘图实际上围绕着单元格视图的bounds

对于可能位于UICollectionView中的任意位置的单元格,他的framebounds将以正常方式(分别相对于父代和本地)有所不同。在UIView及其子视图(MyAnnotationView实例)的情况下,它们的框架和边界将是相同的,因为它们彼此重合。

但是,为了使MyAnnotationView在他注释的单元周围进行绘制,他需要知道单元框架。 IOW,我希望它的0,0点与单元格的相同,但是如果我可以参考他的框架,并且它与单元格的值相同,我会喜欢它。那么可以通过这种方式配置该视图的框架/边界吗?或者我必须进行硬编码搜索,例如

self.superview.superview.frame 

红线是我可以做的一个简单的例子,如果我新注解视图的框架。我会从注记边界的左边中间的一条线到框架的左边的x,以及相同的y值。

也许这个问题的更一般的版本是,是否有一种(简单)的方式来同步绘图的注释视图的坐标系统与UICollectionView的坐标系统,但仍然要知道它的框在附近注解,在?

+0

什么是你试图在注释中绘制父类的applyLayoutAttributes?为什么你需要知道上面层次结构中的位置?为什么局部范围不够? –

+0

有时我会绘制边缘的连接。此外,还会绘制一些对等连接,一旦知道该帧,就可以计算出这些连接。 –

+1

但是你不能在本地绘制它们吗?你能否为你的问题添加一个这样的注释插图? –

回答

0

好吧,忽略不好的设计一分钟,我建议让注释视图知道它们在世界上的位置的最佳方法是通过保留对集合视图的弱引用,然后查询该集合在layoutSubviews查看。

所以:

@property (nonatomic, weak) UICollectionView* owningCollectionView; 

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    self.frameInCollectionViewSpace = [self.owningCollectionView convertRect:self.frame fromView:self]; 

    //Use it here 
} 
1

即使它晚了,对于其他人来说,这里是一个解决方案。 改写从它UICollectionViewCell或UICollectionReusableView

@interface MyCustomCell : UICollectionViewCell 
{ 
    UIView *_annotationView; 
} 
@end 

@implementation MyCustomCell 
- (void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes 
{ 
    [super applyLayoutAttributes:layoutAttributes]; 
    _annotationView.frame = layoutAttributes.frame; 
} 
@end 
相关问题