【问题标题】:Check if UView is inside Self.View bounds检查 UView 是否在 Self.View 范围内
【发布时间】:2014-02-05 00:37:55
【问题描述】:

我有一个视图,其中包含一个设计为水平滚动的 UIScrollView。 (所以 UIScrollView 比 Self.View 宽度宽)

在 UIScrollView 内部,我有十几个 UILables,我让用户循环通过以编程方式添加值,当以编程方式选择下一个 UILable 时,如果它超出范围,我会更改 UIScrollViews 偏移量以确保 UILabel 只出现在视图右侧的左侧。

这就是我当前检查 UILabel 位置然后调整 UILabel 偏移量的方式。

if (positionLabel.frame.origin.x > self.view.frame.size.width) 
{
    [axisContainerScrollView setContentOffset:CGPointMake(positionLabel.frame.origin.x+40 - self.view.frame.size.width, axisContainerScrollView.frame.origin.y) 
                                     animated:YES];
} 
else if (positionLabel.frame.origin.x > self.view.frame.size.width) 
{
    axisContainerScrollView setContentOffset:CGPointMake(0.0, axisContainerScrollView.frame.origin.y) 
                                    animated:YES];
}

所以 positionLabel 原点带回了它在 UIScrollView 内的位置值,然后我更改了 axisContainerScrollView 的偏移量。唯一的问题是,如果我滚动视图并选择一个 UILabel,其偏移量已经在视图内,如果将标签发送回右侧..

我想调整这个 if 语句,如果 UILabel 在 self.view 的范围内,那么我不想更改偏移量。

【问题讨论】:

    标签: ios objective-c uiview uiscrollview uilabel


    【解决方案1】:

    您可以将positionLabel.frame的坐标空间转换为与self.view相同,然后可以使用CGRectContainsRect函数进行您想做的比较。

    类似-

    // convert label frame
    CGRect comparisonFrame = [axisContainerScrollView convertRect:positionLabel.frame toView:self.view];
    // check if label is contained in self.view
    BOOL isContainedInView = CGRectContainsRect(self.view.frame, comparisonFrame);
    

    现在你有了一个BOOL,你可以放在任何条件中,你可以用它来检查。

    【讨论】:

    • 您可能希望与 self.view.bounds 而不是 self.view.frame 进行比较。
    【解决方案2】:

    你看过[UIScrollView scrollRectToVisible:animated:]吗?这可能是一种更优雅的方法来做你想做的事。如果矩形已经可见,我很确定它不会尝试滚动。

    【讨论】:

    • 好的,我现在会调查一下。我仍然觉得这不能解决我在 UILabel 已经在边界内时不滚动的问题。
    猜你喜欢
    • 2023-04-03
    • 2017-07-13
    • 2021-03-30
    • 2016-05-03
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多