菜鸟教程小白 发表于 2022-12-12 23:49:21

objective-c - 将 View 添加到 ScrollView


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

<p>将 View 添加到 ScrollView 的代码:</p>

<p>在 .h 文件中</p>

<pre><code>UIView *customView_;

@property (nonatomic, retain) IBOutlet UIView *customView;
</code></pre>

<p>在 .m 文件中:</p>

<pre><code>@synthesize customView = customView_;

    for (int i = 0; i &lt; 2; i++) {

      UIView *tempView = customView;
      tempView.frame = CGRectMake(i * 187, 0, 187, 133);
      ;
    }
</code></pre>

<p>但是使用上面的代码,我只能在位置看到一个:187,0,187,133。如果我将代码更改为 for <code>(int i = 0; i < 3; i++) {</code> 我只能在 374,0,187,133 中看到 View 。谁能帮我解决这个错误?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><h2>为什么会这样?</h2>

<p> <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/uiview_class/uiview/uiview.html" rel="noreferrer noopener nofollow">Documentation for <code>addSubview:</code></a> </p>

<blockquote>
<p>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.</p>
</blockquote>

<p>使用此代码</p>

<pre><code>UIView *tempView = customView;
tempView.frame = CGRectMake(i * 187, 0, 187, 133);
;
</code></pre>

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

<h2>解决方案</h2>

<p>很遗憾,<code>UIView</code> 不遵循 <code>NSCopying</code> 协议(protocol)。因此,您不能使用 <code>copy</code> 创建它的直接副本。您需要创建一个工厂方法来为您创建 View ,如下所示:</p>

<pre><code>-(UIView)createCustomView {
    ...
}
</code></pre>

<p>然后在你的 <code>for</code> 循环中调用它:</p>

<pre><code>UIView *tempView = ;
tempView.frame = CGRectMake(i * 187, 0, 187, 133);
;
</code></pre>

<p>这可能超出 .xib 文件的范围。引用 <a href="https://stackoverflow.com/questions/3019257/how-do-i-programmatically-duplicate-uiviews-built-in-interface-builder" rel="noreferrer noopener nofollow">this answer</a>关于如何让它与 Interface Builder 配合得很好。</p></p>
                                   
                                                <p style="font-size: 20px;">关于objective-c - 将 View 添加到 ScrollView ,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/13471510/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/13471510/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: objective-c - 将 View 添加到 ScrollView