在ScrollView中获取Frame的X位置

时间:2014-06-25 15:36:12

标签: ios objective-c cgrect

我有一个CustomScrollView,它包含一个UILabel列表并滚动它们(子类用于自动定位视图)。在类中,我有一个存储为NSMutableArray的视图列表。我发现当我从数组中获取标签后请求label.view.frame.origin时,我总是得到{0,0}。因此,我用来滚动的逻辑不起作用(滚动是以编程方式完成的)。我试图让UILabel滚动到CustomScrollView框架的中心。这是一个代码示例,用于显示我遇到问题的位置:

@interface CustomScrollView : UIScrollView
@property (nonatomic) NSMutableArray* labels; //This is the array of UILabels
@end

@implementation CustomScrollView
-(void)scrollToIndex:(int)index withAnimation:(bool)animated
{
    UILabel *label = (UILabel*)self.labels[index];
    CGRect rect = CGRectMake(label.frame.origin.x - ((self.frame.size.width - label.frame.size.width) / 2), 0, self.frame.size.width, self.frame.size.height);
    [self scrollRectToVisible:rect animated:animated];
}
@end

TL:DR - label.frame.origin.x返回0而不是它在superview中的相对位置。 奖金 - 每当我实例化我的自定义滚动视图时,它会自动添加两个子视图,我不知道它来自哪里。我设置背景颜色并关闭滚动条并启用滚动。

提前感谢您的帮助。

编辑[Jun 25 11:38] - 关闭我正在创建滚动的矩形是正确的,但是调用[self scrollRectToVisible:rect animated:animated]只是不起作用。

编辑[Jun 25 12:04] - 这是我每次添加子视图时调用的方法

-(UILabel*)lastLabel
{
    if (self.labels.count == 0)
        return nil;

    return (UILabel*)self.labels.lastObject;
}

-(void)adjustContentSize
{
    if (self.labels.count > 0)
    {
        float lastModifier = [self lastLabel].frame.origin.x + [self lastLabel].frame.size.width + ((self.frame.size.width - [self lastLabel].frame.size.width) / 2);
        self.contentSize = CGSizeMake(MAX(lastModifier, self.contentSize.width), self.frame.size.height);
    }
}

1 个答案:

答案 0 :(得分:2)

尝试使用convertRect函数:

CGRect positionOfLabelInScrollView = [self.scrollView convertRect:myLabel.frame toView:nil];
[self.scrollView setContentOffset:CGPointMake(0, topOfLabel - positionOfLabelInScrollView.origin.y + positionOfLabelInScrollView.size.height) animated:YES];

这应滚动您的scrollView以显示标签。