如何从 UIScrollView 获取 UIButton 位置

Posted

技术标签:

【中文标题】如何从 UIScrollView 获取 UIButton 位置【英文标题】:How to get UIButton position from UIScrollView 【发布时间】:2015-04-23 10:09:09 【问题描述】:

我有一个scrollView,上面有很多按钮。我正在尝试从滚动中获取 Button 位置,以便将其滚动到该位置。我的问题是,一旦单击每个按钮,我总是在 _btnV.frame.origin.x 中获得相同的值。那么请问我该如何解决这个问题呢?

- (void)scrollView

    segmentWidth = screenWidth / 5;

    NSArray *images = @[@"Smiley-1.png",@"Smiley-2.png",@"Smiley-3.png",@"Smiley-4.png",@"Smiley-5.png",@"Smiley-5.png",@"Smiley-5.png",@"Smiley-4.png",@"Smiley-1.png",@"Smiley-2.png",@"Smiley-3.png",@"Smiley-4.png"];

    long ScrollContentSize = ((images.count -1)*segmentWidth)+screenWidth;

    _scrlView.contentSize = CGSizeMake(ScrollContentSize, _scrlView.frame.size.height);

    float screenX2 = screenHeight/2 - segmentWidth/2;

    __block float screenX = (screenWidth-segmentWidth)/2;

    NSMutableArray *arr = [[NSMutableArray alloc] init];

    for(int i=0; i<images.count; i++)
    
        _btnV = [[UIButton alloc]init];
        [_btnV setFrame:CGRectMake(screenX, screenX2, segmentWidth, segmentWidth)];
        [_btnV setImage:[UIImage imageNamed:[NSString stringWithFormat:@"%@",[images objectAtIndex:i]]] forState:UIControlStateNormal];
        [_btnV setBackgroundColor:[UIColor redColor]];
        [_btnV addTarget:self action:@selector(scrollToMe:) forControlEvents:UIControlEventTouchUpInside];

        [_btnV setTag:i];

        [arr addObject:_btnV];
        [_scrlView addSubview:_btnV];

        screenX = screenX+segmentWidth;
    

    _menuItems = arr;

    [self.view addSubview:_scrlView];



-(void) scrollToMe:(id)sender

    int scrollX = _scrlView.contentOffset.x;
    int mod = scrollX % segmentWidth;
    int position = scrollX/segmentWidth;
    float positionOffset = (float) mod / segmentWidth;

    scrollX = position * segmentWidth;

    NSLog(@"position:%f",_btnV.frame.origin.x);

    //scrollX = ...

    [_scrlView setContentOffset:CGPointMake(scrollX, scrollX) animated:YES];

【问题讨论】:

在 UIButton 选择器方法中需要调用 setContentOffset 的内容。因为你是 tapping on UIButton 意味着你已经在这个偏移量上。 【参考方案1】:

使用标签值查找按钮

-(void) scrollTo:(id)sender

    UIButton * button = (UIButton *)sender;
    int position = button.tag;

    scrollX = position * segmentWidth;

    NSLog(@"position:%f",_btnV.frame.origin.x);

    //scrollX = ...

    [_scrlView setContentOffset:CGPointMake(scrollX, scrollX) animated:YES];

【讨论】:

这很好,我不知道我应该给发件人打电话。【参考方案2】:

您正在调用UIButton 的选择器方法。所以在这个方法中,你可以直接得到 UIButton 相对于UIScrollView 的位置。喜欢

-(void) scrollTo:(id)sender

    UIButton* btnClick = (UIButton*)sender;
    NSLog(@"X position : %f",btnClick.frame.origin.x);

希望对您有所帮助。

【讨论】:

如果您想要一些不同的东西,请告诉我。 您的解决方案如下所示,再次感谢您的帮助。我不认为我应该打电话给按钮发件人。我投票+1 @CAN,请阅读我的评论。我认为 UIButton 选择器方法中不需要 setContents。【参考方案3】:

试试这个,它会正确记录你所有按钮的位置

 -(void) scrollTo:(id)sender

    int scrollX = _scrlView.contentOffset.x;
    int mod = scrollX % segmentWidth;
    int position = scrollX/segmentWidth;
    float positionOffset = (float) mod / segmentWidth;

    scrollX = position * segmentWidth;
for(int i=0; i<images.count; i++)
   if([[[_scrlView subviews] objectAtIndex:i] isKindOfClass:[UIButton class]]) 
        Button btn = [[_scrlView subviews] objectAtIndex:i];
NSLog(@"position:%f",btn.frame.origin.x);
    


    //scrollX = ...

    [_scrlView setContentOffset:CGPointMake(scrollX, scrollX) animated:YES];

【讨论】:

以上是关于如何从 UIScrollView 获取 UIButton 位置的主要内容,如果未能解决你的问题,请参考以下文章

如何从 UIScrollView 获取 UIButton 位置

如何从 UIScrollView 导航到自定义页面

从 UIScrollView 后面的 unbutton 获取操作

Objective-C:从 UIScrollView 获取缩放的裁剪图像

如何在 UiScrollview 中获取子视图的内容

iOS 11 从 UITableView 或 UIScrollView 获取 visibleHeight 和 contentInset