Blaze Phoenix
Blaze Phoenix

Reputation: 889

Get X position of Frame in ScrollView

I have a CustomScrollView which holds a list of UILabels and scrolls through them (the subclassing is for automatic positioning of the views). In the class I have a list of these views stored as an NSMutableArray. I have found that when I ask for label.view.frame.origin after getting the label from the array, I always get {0, 0}. Because of this, the logic I use to scroll does not work (the scroll is done programmatic-ally). I am trying to have the UILabel scroll to the center of the frame of the CustomScrollView. Here is a code sample to show where I am having problems:

@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 is returning me 0 and not what it's relative position is within the superview. Bonus - Whenever I instantiate my custom scroll view, it automatically adds two subviews which I have no idea where the come from. I set the background color and turn off the scroll bars and scroll enabled.

Thanks in advance for the help.

Edit [Jun 25 11:38] - Turns out the rect I am creating to scroll is correct, but calling [self scrollRectToVisible:rect animated:animated] is just not working.

Edit [Jun 25 12:04] - Here is the method which I call every time I add a subview

-(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);
    }
}

Upvotes: 1

Views: 2001

Answers (1)

Travis M.
Travis M.

Reputation: 11257

Try using the convertRect function:

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

This should scroll your scrollView to display the label.

Upvotes: 2

Related Questions