objective-c - 将 View 添加到 ScrollView

标签 objective-c ios uiscrollview ios4

我的 View Controller 中有一个 ScrollView 。我还创建了一个 View 并将其连接到 IBOutlet 变量。我需要向 ScrollView 添加许多 View 。

向 ScrollView 添加 View 的代码:

在.h文件中

UIView *customView_;

@property (nonatomic, retain) IBOutlet UIView *customView;

在 .m 文件中:

@synthesize customView = customView_;

    for (int i = 0; i < 2; i++) {

        UIView *tempView = customView;
        tempView.frame = CGRectMake(i * 187, 0, 187, 133);
        [scrollView addSubview:tempView];
    }

但是使用上面的代码,我只能在以下位置看到一个:187,0,187,133。如果我将代码更改为 (int i = 0; i < 3; i++) {我只能在 374,0,187,133 中看到 View 。谁能帮我解决这个错误?

最佳答案

为什么会发生这种情况?

Documentation for addSubview:

Views can have only one superview. If view already has a superview and that view is not the receiver, this method removes the previous superview before making the receiver its new superview.

使用此代码

UIView *tempView = customView;
tempView.frame = CGRectMake(i * 187, 0, 187, 133);
[scrollView addSubview:tempView];

您正尝试添加相同 View 两次/三次。根据文档中的注释,这将删除前一个,并将其添加到新位置。 (虽然 super View 是您的情况的接收者,但这仍然并不意味着它会复制您的 View 并再次添加)。

解决方案

不幸的是,UIView 不遵循 NSCopying 协议(protocol)。因此,您无法使用 copy 创建它的直接副本。您将需要创建一个工厂方法来为您创建 View ,如下所示:

-(UIView)createCustomView {
    ...
}

然后在 for 循环中调用它:

UIView *tempView = [self createCustomView];
tempView.frame = CGRectMake(i * 187, 0, 187, 133);
[scrollView addSubview:tempView];

这可能会超出 .xib 文件的范围。引用this answer关于如何让它与 Interface Builder 很好地配合。

关于objective-c - 将 View 添加到 ScrollView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13471510/

相关文章:

ios - 使用 nspredicate 将 for 循环中的 NSArray 与给定输入进行比较

ios - Json 解析失败

ios - iOS将数据写入文件,文件不存在

iphone - UIScrollView滚动不流畅?

ios - 辅助 NSThread 中的 NSTimer 不起作用

objective-c - 如何正确实现 QLPreviewPanel 数据源并牢记安全范围的 URL?

ios - 如何实现捏合放大相机(Swift 3)?

ios - 根据所需语言检索文件

swift - contentoffset UIScrollView Swift 的平滑移动

ios - UIPageViewController 转换 PageCurl 与 UIScrollView 错误的页面索引