为啥 UIButton 在模拟器中这么大?

Posted

技术标签:

【中文标题】为啥 UIButton 在模拟器中这么大?【英文标题】:Why the UIButton is so big in a simulator?为什么 UIButton 在模拟器中这么大? 【发布时间】:2015-04-26 00:28:29 【问题描述】:

我在它下面有一个 UIPageViewController 和一个 UIButton。这是我的故事板的屏幕截图。

当我构建应用程序时,按钮很大:

我的所有约束都是自动设置的。我试图指定高度,但它没有帮助。有什么想法吗?

附:我正在使用 XCode 6.3。

编辑:

ViewController.swift

import UIKit

class ViewController: UIViewController, UIPageViewControllerDataSource 

    @IBOutlet weak var restartButton: UIButton!
    var pageViewController: UIPageViewController!
    var pageTitles: NSArray!
    var pageImages: NSArray!

    override func viewDidLoad() 
        super.viewDidLoad()

        self.pageTitles = NSArray(objects: "Page 1", "Page 2")
        self.pageImages = NSArray(objects: "algorithm", "apoint")

        self.pageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageViewController") as! UIPageViewController

        self.pageViewController.dataSource = self

        var startVC = self.viewControllerAtIndex(0) as ContentViewController
        var viewControllers = NSArray(object: startVC)

        self.pageViewController.setViewControllers(viewControllers as [AnyObject], direction: .Forward, animated: true, completion: nil)

        self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.size.height - restartButton.frame.height)

        self.addChildViewController(self.pageViewController)
        self.view.addSubview(self.pageViewController.view)
        self.pageViewController.didMoveToParentViewController(self)
        self.view.sendSubviewToBack(self.pageViewController.view)

    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    func viewControllerAtIndex(index: Int) -> ContentViewController 
        if ((self.pageTitles.count == 0) || (index >= self.pageTitles.count)) 
            return ContentViewController()
        

        var vc: ContentViewController = self.storyboard?.instantiateViewControllerWithIdentifier("ContentViewController") as! ContentViewController
        vc.imageFile = self.pageImages[index] as! String
        vc.titleText = self.pageTitles[index] as! String
        vc.pageIndex = index

        return vc
    

    @IBAction func restartAction(sender: AnyObject) 
        var startVC = self.viewControllerAtIndex(0) as ContentViewController
        var viewControllers = NSArray(object: startVC)
        self.pageViewController.setViewControllers(viewControllers as [AnyObject], direction: .Forward, animated: true, completion: nil)
    

    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? 

        var vc = viewController as! ContentViewController
        var index = vc.pageIndex as Int

        if (index == 0) || (index == NSNotFound) 
            return nil
        

        index--
        return self.viewControllerAtIndex(index)

    

    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? 
        var vc = viewController as! ContentViewController
        var index = vc.pageIndex as Int

        if index == NSNotFound 
            return nil
        

        index++

        if index == self.pageTitles.count 
            return nil
        

        return self.viewControllerAtIndex(index)
    

    func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int 
        return self.pageTitles.count
    

    func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int 
        return 0
    


【问题讨论】:

我会删除所有约束并自己重新设置它们 @DanBeaulieu 我试过了。我不确定如何在按钮和 UIPageViewController 之间设置约束。现在,我做了自动约束,然后做了 self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.size.height - helloWorldButton.frame.height) 以便为按钮留出空间。 如果您以编程方式创建按钮,您应该发布一些代码。我以为你是在 Xcode 的故事板设计器中创建的。我不确定我的回答是否真的能帮到你。 编辑您的问题以显示您的代码。 @matt 添加了代码。 restartButton 是我遇到的问题。 【参考方案1】:

我猜问题是你有一个从按钮顶部到界面中其他东西的约束。摆脱这种束缚。屏幕底部按钮所需的唯一约束是它的底部和它的右或左或中心 - 它的宽度和高度是自动的。

【讨论】:

我喜欢这种情况! :) @jackson 如果它解决了您的问题,请确保将其标记为答案。 :)【参考方案2】:

您需要像这样在控制器场景中找到您的按钮,突出显示您的约束并删除它们。

就个人而言,当我遇到约束问题时,我会从头开始删除所有约束。这只是我个人的做法。

接下来我要做的是从故事板视图顶部的项目开始,并像这样设置它的约束:

请注意,在我的添加约束窗口中,我只选择 topleft 边距以及 widthheight。我从屏幕顶部开始对每个对象执行此操作,然后一直到底部。

显然,您需要稍微使用一下此功能才能获得所需的结果。请注意,我提供的只是一个示例,并非一劳永逸。


编辑:

阅读您的评论后,我不确定此解决方案是否会对您有所帮助,我没有意识到您以编程方式制作了按钮。我暂时先放着。

【讨论】:

抱歉,该按钮是在情节提要中创建的。我以编程方式做的唯一一件事是更改 UIPageViewController 的大小,方法是将其高度降低到按钮的高度,即 pageViewController.height - button.height。我刚刚检查了按钮的约束,它只有“宽度”,但没有高度。 尝试像我在图片中所做的那样在“添加新约束”窗格中设置高度和宽度,它应该会限制按钮的大小

以上是关于为啥 UIButton 在模拟器中这么大?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 UIButton 框架设置这么慢

为啥xcode7创建的UIButton点击不灵敏,需要长按才响应点击?

为啥 iPhone 模拟器的规模 * 比现实大 *?

在模拟器上运行时 UIButton 宽度不填充工具栏

UIImageView 和 UIButton 背景图像在模拟器中加载时变黑

Swift UIButton 子类未显示在设备或模拟器上