【问题标题】:Can I make the frame of my UIView match its great grandparent?我可以让我的 UIView 的框架匹配它的曾祖父母吗?
【发布时间】:2014-03-14 00:18:14
【问题描述】:

我得到了简单级别的框架/边界。仍在尝试升级到更高级的用途...

我有一个看起来像这样的视图堆栈:

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

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

但要让 MyAnnotationView 围绕他正在注释的单元格进行绘制,他需要了解单元格框架。 IOW,我希望它的 0,0 点与单元格的相同,但如果我可以参考他的框架并让它与单元格的值相同,我会喜欢它。是否可以以这种方式配置该视图的框架/边界?还是我必须进行硬编码搜索,例如

self.superview.superview.frame

红线是一个简单的例子,如果我新建注释视图的框架,我可以做些什么。我会从注释边界的左侧中间到框架的左侧 x 取反,并且 y 值相同。

也许这个问题的一个更通用的版本是,是否有一种(简单的)方法可以将注释视图的坐标系与 UICollectionView 的坐标系同步,但仍然要知道它正在注释的框的位置周围,​​在吗?

【问题讨论】:

  • 你想在注释中画什么?为什么需要知道上面层次结构中的位置?为什么局部边界不够?
  • 我有时会在边缘绘制连接。此外,还绘制了一些对等连接,一旦知道框架,就可以计算出这些连接。
  • 但是不能在本地画出来吗?您能否在您的问题中添加此类注释的插图?
  • 我同意 Leo 的观点。如果有外部视图需要适当绘制的信息,则应该告诉该信息。一个视图永远不应该对它之外的其他视图有任何了解。如果需要计算具体的坐标、角度等,cell可以进行计算。
  • @TravisGriggs 根据您的示例,您不应该从子视图甚至单元格内部绘制红线。

标签: ios uiview ios7 bounds


【解决方案1】:

尽管为时已晚,但对其他人来说,这是一个解决方案。 覆盖父类 UICollectionViewCell 或 UICollectionReusableView 中的 applyLayoutAttributes

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

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

【讨论】:

    【解决方案2】:

    好吧,暂时忽略糟糕的设计,我建议让注释视图了解它们在UICollectionView 世界中的位置的最佳方法是传递对集合视图的弱引用,然后查询它layoutSubviews 中的集合视图。

    所以:

    @property (nonatomic, weak) UICollectionView* owningCollectionView;
    

    - (void)layoutSubviews
    {
        [super layoutSubviews];
    
        self.frameInCollectionViewSpace = [self.owningCollectionView convertRect:self.frame fromView:self];
    
        //Use it here
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-14
      • 1970-01-01
      • 2018-10-15
      • 2020-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多