Swift/Xcode

[Swift] UIButton Configuration

yeggrrr๐Ÿผ 2024. 5. 30. 09:35
UIButton Configuration


iOS 15๋กœ ์—…๋ฐ์ดํŠธ ์ดํ›„๋กœ UIButton์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋‹ค์–‘ํ•ด์กŒ๋‹ค.
์—…๋ฐ์ดํŠธ ๋œ ์Šคํƒ€์ผ์„ ์ฑ„ํƒํ•˜์—ฌ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์–ด์šธ๋ฆฌ๋Š” ๋ฒ„ํŠผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ธฐ์กด์— UIButton์€ .setTitle / .setImage ๋“ฑ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฒ„ํŠผ์˜ ๋ชจ์–‘์„ ๋””์ž์ธํ–ˆ์ง€๋งŒ,
iOS 15์—์„œ ์ถ”๊ฐ€๋œ UIButton.Configuration์€ ๊ธฐ๋ณธ ๊ตฌ์„ฑ์„ ์กฐ๊ธˆ ๋” ์‰ฝ๊ณ , ๋‹ค์–‘ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

configuration์€ ํฌ๊ฒŒ 4๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.


์Šคํ† ๋ฆฌ๋ณด๋“œ์—์„œ ๋ฒ„ํŠผ์„ ์ƒ์„ฑํ•  ๋•Œ, ๋ณด๊ณ  ๊ทธ๋ƒฅ ์ง€๋‚˜์ณค๋˜ ๋‹ค๋ฅธ ๋ฒ„ํŠผ๋“ค์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค.

1. plain (๋ฐฐ๊ฒฝ์ด ํˆฌ๋ช…ํ•œ ๋ฒ„ํŠผ)

static func plain() -> UIButton.Configuration

→ Creates a configuration for a button with a transparent background.


2. Gray (ํšŒ์ƒ‰ ๋ฐฐ๊ฒฝ์˜ ๋ฒ„ํŠผ)

static func gray() -> UIButton.Configuration

→ Creates a configuration for a button with a gray background.


3. Tinted (์ƒ‰์กฐ๊ฐ€ ์žˆ๋Š” ๋ฐฐ๊ฒฝ์ƒ‰์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ฒ„ํŠผ)

static func tinted() -> UIButton.Configuration

→ Creates a configuration for a button with a tinted background color.


4. Filled (์ƒ‰์กฐ ์ƒ‰์ƒ์œผ๋กœ ๋ฐฐ๊ฒฝ์ด ์ฑ„์›Œ์ง„ ๋ฒ„ํŠผ)

static func filled() -> UIButton.Configuration

→ Creates a configuration for a button with background filled with the button's tint color.


์ด์™ธ์—๋„ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ช‡๊ฐ€์ง€ ๊ตฌ์„ฑ๋“ค์ด ๋” ์žˆ๋‹ค.

static func borderless() -> UIButton.Configuration
// Creates a configuration for a button that has a borderless style.
// ํ…Œ๋‘๋ฆฌ ์—†๋Š” ์Šคํƒ€์ผ์˜ ๋ฒ„ํŠผ

static func bordered() -> UIButton.Configuration
// Creates a configuration for a button that has a bordered style.
// ํ…Œ๋‘๋ฆฌ ์Šคํƒ€์ผ์ด ์žˆ๋Š” ๋ฒ„ํŠผ

static func borderedTinted() -> UIButton.Configuration
// Creates a configuration for a button that has a tinted, bordered style.
// ์ƒ‰์กฐ์™€ ํ…Œ๋‘๋ฆฌ ์Šคํƒ€์ผ์ด ์žˆ๋Š” ๋ฒ„ํŠผ

static func borderedProminent() -> UIButton.Configuration
// Creates a configuration for a button that has a prominent, bordered style.
// ๋ˆˆ์— ์ž˜ ๋„๋Š” ํ…Œ๋‘๋ฆฌ ์Šคํƒ€์ผ์˜ ๋ฒ„ํŠผ


์œ„์™€ ๊ฐ™์ด ๋ฒ„ํŠผ ๋ฐฐ๊ฒฝ ์†์„ฑ์„ ํฌํ•จํ•ด์„œ ๋ฒ„ํŠผ์— ๋“ค์–ด๊ฐˆ Title(์ œ๋ชฉ)๋“ฑ์— ๋Œ€ํ•œ ๊ตฌ์„ฑ, ์ด๋ฏธ์ง€ ๊ตฌ์„ฑ, ๋ฒ„ํŠผ์˜ ์ฝ˜ํ…์ธ  ์˜์—ญ์—์„œ์˜ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ ๋“ฑ์„ configuration ์Šคํƒ€์ผ์„ ์ฑ„ํƒํ•ด์„œ ์ƒˆ๋กœ์šด ๋ฒ„ํŠผ ๋™์ž‘๊ณผ ๋ชจ์–‘์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋‹ค.


 

๋ฐ”๋กœ configuration ๊ตฌ์กฐ์ฒด๋ฅผ ํ™•์žฅํ•ด์„œ ๋ฒ„ํŠผ์„ ํ•œ๋ฒˆ ๋งŒ๋“ค์–ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

extension UIButton.Configuration {
    static func yegrStyle() -> UIButton.Configuration {
        var configuration = UIButton.Configuration.filled()
        configuration.title = "Swift"
        configuration.subtitle = "์„œ๋ธŒํƒ€์ดํ‹€ ์ž…๋‹ˆ๋‹ค์š”"
        configuration.titleAlignment = .center
        configuration.baseBackgroundColor = .systemGreen // ๋ฒ„ํŠผ ๋ฐฐ๊ฒฝ์ƒ‰
        configuration.baseForegroundColor = .white // title ๋ฐ image ์ƒ‰์ƒ
        configuration.titlePadding = 5 // title ์‚ฌ์ด ๊ฐ„๊ฒฉ
        configuration.image = UIImage(systemName: "leaf.fill")
        configuration.imagePlacement = .trailing // ์ด๋ฏธ์ง€ ์œ„์น˜
        configuration.imagePadding = 8
        configuration.cornerStyle = .capsule // capsule, dynamic, fixed, large, medium, small
        return configuration
    }
}

cornerStyle


์•„๋ž˜์™€ ๊ฐ™์ด ์ด๋ฏธ์ง€ ๋Œ€์‹  indicator ์Šคํƒ€์ผ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

configuration.activityIndicatorColorTransformer = .grayscale // grayscale, monochromeTint, preferredTint
configuration.showsActivityIndicator = true


grayscale, preferredTint ๋‘˜์˜ ์ฐจ์ด๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค.. ๋‘˜๋‹ค white ์ƒ‰์ƒ indicator..?
monochromeTint๋Š” darkgray? black ์ƒ‰์ƒ์ด๋‹ค.

์ด ๋””์ž์ธ์€ ๋ฐ์ดํ„ฐ ๋ฐ›์•„์˜ค๋Š” ์†๋„๊ฐ€ ๋А๋ฆฐ ์ƒํƒœ์ด๊ฑฐ๋‚˜, ์‚ฌ์šฉ์ž์—๊ฒŒ ์ง„ํ–‰์ค‘์ธ ์ƒํƒœ๋ฅผ ์•Œ๋ ค์ค˜์•ผํ•  ๋•Œ(?) ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

์ด ๋ฐ–์—๋„ ์—ฌ๋Ÿฌ๊ฐ€์ง€ configuration์ด ์žˆ์œผ๋‹ˆ, ํ•˜๋‚˜์”ฉ ๋ˆŒ๋Ÿฌ์„œ ์„ค์ •ํ•ด๊ฐ€๋ฉด์„œ '์ด๋Ÿฐ๊ฒŒ ์žˆ๊ตฌ๋‚˜~'ํ•˜๊ณ  ์•Œ์•„๋‘๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.


์œ„์™€ ๊ฐ™์ด extension์œผ๋กœ ์›ํ•˜๋Š” ์Šคํƒ€์ผ๋Œ€๋กœ ์„ค์ •ํ•œ ํ›„,

import UIKit
import SnapKit

class ViewController: UIViewController {
    let swiftButton = UIButton()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        configureUI()
    }

    func configureUI() {
    	view.backgroundColor = .systemGray5
        view.addSubview(swiftButton)
        let safeArea = view.safeAreaLayoutGuide
        swiftButton.snp.makeConstraints {
            $0.top.equalTo(safeArea).offset(200)
            $0.horizontalEdges.equalTo(safeArea).inset(80)
            $0.height.equalTo(50)
        }
        
        swiftButton.configuration = .yegrStyle()
    }
}


๋ฒ„ํŠผ์ด๋ฆ„.configuration = ๋งŒ๋“ค์—ˆ๋˜ UIButton.Configuration

์ด๋ ‡๊ฒŒ ํ•ด์ฃผ๋ฉด! ์•„๋ž˜ ํ™”๋ฉด์ฒ˜๋Ÿผ ๋ฒ„ํŠผ์ด ์™„์„ฑ๋œ ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 


 

728x90