当前位置: 首页 > 知识库问答 >
问题:

我无法在我的子视图中居中一个按钮,我已经被卡了好几个星期了(斯威夫特)

唐修能
2023-03-14

我正在用可可豆荚(Shuffle)构建一个应用程序,其中有一个cardStack(tinder风格),每个卡片在中心包含一个单词。我正试图用下面的代码为每张卡片添加一个按钮,但是当我设法以编程方式添加按钮时,我无法将其居中:当我使用“button.center=card.center”时,按钮将保留在“卡片视图”的坐标(0,0)处。我附上了一张截图,你可以看到右上角(0,0)坐标处的圆角白色按钮,如前所述。我错在哪里?它应该是相当初级的,但我被卡住了。

import UIKit
import Shuffle


class CardsViewController: UIViewController, SwipeCardStackDataSource, SwipeCardStackDelegate {
    
    let cardStack = SwipeCardStack()
    var actualIndex : Int = 0

    var showingBack = false
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(cardStack)
        cardStack.frame.size.height = view.frame.size.height - 180
        cardStack.frame.size.width = view.frame.size.width
        cardStack.center.y =  CGFloat(cardStack.frame.size.height/2)
        cardStack.center.x =  CGFloat(cardStack.frame.size.width/2)
        cardStack.center = CGPoint(x: view.center.x, y: view.center.y + 78)
        cardStack.dataSource = self
        
//        BUTTON
        
        
        
//        NAVIGATION BAR TRANSPARENT
        
        self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
        self.navigationController?.navigationBar.shadowImage = UIImage()
        self.navigationController?.navigationBar.isTranslucent = true
        
        
//        CENTRAL BUTTON

    }
    
    
    func card(fromImage word: String) -> SwipeCard {
        let card = SwipeCard()
        card.swipeDirections = [.left, .right]
        for direction in card.swipeDirections {
          card.setOverlay(CardOverlay(direction: direction), forDirection: direction)
        }
        card.content = CardContentView(withWord: word)
        card.footer = CardFooterView(withTitle: "", subtitle: "")
        view.backgroundColor = .red
        
        let button = UIButton()
         button.frame.size = CGSize(width: 70, height: 70)
        button.layer.cornerRadius = button.frame.width/2
        button.clipsToBounds = true
        button.backgroundColor = .init(white: 1, alpha: 1)

        button.center = card.center
        
        card.addSubview(button)
            return card
    }
    
    
    func cardStack(_ cardStack: SwipeCardStack, cardForIndexAt index: Int) -> SwipeCard {
        let  theCard = card(fromImage: cardWords[actualIndex].word)
        actualIndex = actualIndex + 1
        return theCard
    }

截图

共有1个答案

花飞扬
2023-03-14

问题是,当您试图添加按钮时,框架尚未有效。

我还没有使用过这个“shuffle”pod,但是快速的查看告诉我你想要使用自动布局/约束,而不是尝试根据框架中心设置按钮的位置。

这样试试:

func card(fromImage word: String) -> SwipeCard {
    let card = SwipeCard()
    card.swipeDirections = [.left, .right]
    for direction in card.swipeDirections {
        card.setOverlay(CardOverlay(direction: direction), forDirection: direction)
    }
    card.content = CardContentView(withWord: word)
    card.footer = CardFooterView(withTitle: "", subtitle: "")
    view.backgroundColor = .red
    
    // changes begin here...
    let button = UIButton()
    // use auto-layout / constraints
    //button.frame.size = CGSize(width: 70, height: 70)
    
    button.translatesAutoresizingMaskIntoConstraints = false

    // add button to card
    card.addSubview(button)

    // button width = 70, height equalTo width
    button.widthAnchor.constraint(equalToConstant: 70.0).isActive = true
    button.heightAnchor.constraint(equalTo: button.widthAnchor).isActive = true
    
    // center it in the card view
    button.centerXAnchor.constraint(equalTo: card.centerXAnchor).isActive = true
    button.centerYAnchor.constraint(equalTo: card.centerYAnchor).isActive = true

    // frame is not yet valid, so use 70 / 2
    button.layer.cornerRadius = 35.0 //button.frame.width/2
    
    button.clipsToBounds = true
    button.backgroundColor = .init(white: 1, alpha: 1)
    
    return card
}

根据您的SwipeCardCardContentView类设置的方式,您可能需要将按钮添加到内容视图中,而不是添加到卡本身(您没有显示那些类,所以很难猜测)。

作为附带说明:您确实应该修改SwipeCard类或CardContentView类,并在其中添加按钮...

 类似资料:
  • 基本上,当点击其中一个按钮时,代码中的变量就会发生变化。这些按钮运行良好,完全符合我的要求,但当按钮超过13个时,它们不会全部出现,我需要52个。

  • https://maven.apache.org/xsd/maven-4.0.0.xsd“>4.0.0 org.springframework.boot spring-boot-starter-parent 2.2.6.release com.bookstore bookstore 0.0.1-snapshot bookstore这是我的项目的描述。 http://localhost:8081/M

  • 问题内容: 函数定义中的下划线是什么意思? 例如 我了解在定义函数时,我可以执行以下操作: 然后,我将其称为而不是,即故意隐藏参数名称吗? 问题答案: Swift需要一个约定来说明函数名称是什么,不仅包括函数名称本身(在括号之前),还包括参数的外部名称。约定是名称后跟冒号。因此,这是一个函数声明(在Swift 2.0中): 这是该函数的名称: 但是,在现实生活中,一个或多个参数有可能(实际上)不会

  • 我知道以前可能有人问过这个问题,但我似乎找不到适合我情况的合理答案。 我有一个表单,表单中有多个提交按钮,我需要知道按下了哪个按钮。 表单内部的一个小代码段可能如下所示: fmt:消息部分只是考虑了客户端的语言并将单词放在按钮上。 到目前为止,我在submit按钮上添加了一个动作处理程序,并在表单上添加了一个隐藏的input元素,告诉我哪个按钮被按下了,但是我需要在不依赖javascript的情况

  • 问题内容: 我有一个包含多个链接的页面,可将用户重定向到其他页面。我以为使用表单会更好,所以我定义了一个带有Multiple的WTForms 。如何确定单击了哪个按钮并基于该按钮重定向? 问题答案: 您在表单中添加了两个按钮,因此请检查哪个字段的数据是。