检查 UView 是不是在 Self.View 范围内

Posted

技术标签:

【中文标题】检查 UView 是不是在 Self.View 范围内【英文标题】: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 的范围内,那么我不想更改偏移量。

【问题讨论】:

【参考方案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 已经在边界内时不滚动的问题。

以上是关于检查 UView 是不是在 Self.View 范围内的主要内容,如果未能解决你的问题,请参考以下文章

uni-app_uView1.0 输入框里获得焦点时边框颜色改变,失去焦点后边框恢复原颜色

self.view.frame 在横向模式下意外更改大小

2.页面绘制和引入组件库uView

添加滚动视图时,所有视图都显示在导航栏后面的self.view顶部

使用 self.view.frame 时 UIImageView initWithFrame 大小不正确

从它自己的 UView 子类中添加 UIView 作为 SuperView 子视图