[UIKit/Storyboard] Shadow vs ClipsToBound

2023. 7. 23. 18:26ยท๐ŸŽ Dev/UIKit

 

๐Ÿ’ป ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ: ์‚ฌ์šฉ์ž๊ฐ€ DatePicker์—์„œ ์„ ํƒํ•œ ๋‚ ์งœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ +100์ผ, +200์ผ, +300์ผ, +400์ผ์ด ํ•ฉ์‚ฐ ๋œ ๋‚ ์งœ๊ฐ€ ์ด๋ฏธ์ง€ ์œ„์— ๋œจ๋„๋ก ๋งŒ๋“ค๊ธฐ.

 

โœ๏ธ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•œ ๊ฐœ๋…: IBOutlet, IBAction, Sub ImageView, Shadow ์™€ ClipsToBound

 

๐Ÿ’ญ ์–ด๋ ค์› ๋˜ ๋ถ€๋ถ„: ์„ค์ •ํ•œ ๊ทธ๋ฆผ์ž๊ฐ€ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์— ๋‚˜์˜ค์ง€ ์•Š์Œ, (์ฒซ) ๋งค๊ฐœ๋ณ€์ˆ˜ ์‘์šฉ, ํ•จ์ˆ˜์‹ ์ •๋ฆฌ

 

 

 

 

๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ํ™”๋ฉด

 

 

 

 

 

๐Ÿ“Œ ์ด๋ฏธ์ง€๋ทฐ ๋’ค๋กœ ๊ทธ๋ฆผ์ž ๋งŒ๋“ค๊ธฐ

 

(1) UIView -> UIImage -> label : ๊ฐ ์†์„ฑ์„ ์‚ด๋ฆฌ๋Š” ๋ ˆ์ด์–ด ์Œ“๊ธฐ

 

 

๊ธฐ์–ตํ•˜์ž ์ด๋ฏธ์ง€ ๋’ค๋กœ ๊ทธ๋ฆผ์ž ๋งŒ๋“ค ๋• ๊ผญ UIView๋ฅผ ์จ์ฃผ๊ธฐ๋กœ.

 

- UIView๋ฅผ ์‹œ์ž‘์œผ๋กœ ์ฐจ๊ณก์ฐจ๊ณก ๋ ˆ์ด์–ด๋ฅผ ์Œ“์•„์ฃผ์–ด์•ผ ํ•œ๋‹ค.

  • UIImageView๋งŒ ์“ฐ๋ฉด layer.cornerRadius ์„ค์ •ํ•  ๋•Œ shadow ์„ค์ •ํ•œ ๋ถ€๋ถ„์ด ํ•จ๊ป˜ ์ž˜๋ ค๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—. (์ •์‚ฌ๊ฐํ˜• ์•ˆ์— ๋™๊ทธ๋ผ๋ฏธ๋ฅผ๊ฝ‰ ์ฐจ๊ฒŒ ๋„ฃ์—ˆ์„ ๋•Œ, ๋™๊ทธ๋ผ๋ฏธ์™€ ๋‹ฟ์ง€ ์•Š์€ ์ •์‚ฌ๊ฐํ˜• ๋ถ€๋ถ„์ด ๋ชจ๋‘ ์ณ๋‚ด์ง„๋‹ค๋Š” ์‹์œผ๋กœ ๊ธฐ์–ตํ•˜๊ธฐ)
  • โ—๏ธ๊ณผ์ œ ๋ฆฌ๋ทฐ๋ฅผ ๋“ค์œผ๋ฉฐ ๋‚ด๊ฐ€ ๋ชฐ๋ž๋˜ ๋ถ€๋ถ„์ด UIView๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ์•ˆ์— UIImageView์™€ label์ด ์†Œ์† ๋˜์–ด์•ผํ•œ๋‹ค๋Š” ๊ฑธ ๋ชฐ๋ผ์„œ ๋ฐฑ๋‚  ๊ทธ๋ฆผ์ž ์„ค์ •์„ ํ•ด๋„ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์— ๋œจ์งˆ ์•Š์•˜์—ˆ๋‹ค. ์ •๋ง ๋ญ˜ ํ•ด๋„ ๋œจ์งˆ ์•Š์•˜์Œ.

 

(2) layer.cornerRadius

 

๊ทธ๋ฆผ์ž ์žˆ ๋ชจ์„œ๋ฆฌ ์žˆ

 

        backgroundImage.layer.cornerRadius = 20
        
        backgroundView.layer.shadowColor = UIColor.black.cgColor
        backgroundView.layer.shadowOffset = CGSize(width: 10, height: 10)
        backgroundView.layer.shadowRadius = 10
        backgroundView.layer.shadowOpacity = 0.5
        
        backgroundView.clipsToBounds = false

 

- shadow ์„ค์ •์€ code snippet(๋‹จ์ถ•ํ‚ค: command + shift + L) ์— ์ €์žฅํ•ด๋‘” ๊ฑธ ๊บผ๋‚ด ์ผ๋‹ค. 

- UIView๋ฅผ ํ™œ์šฉํ•˜์ž ๊ทธ๋ฆผ์ž๊ฐ€ ๋“œ๋””์–ด ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์— ๋‚˜ํƒ€๋‚ฌ๋‹ค! ๋Œ€์‹  ๋ชจ์„œ๋ฆฌ๋„ ํ•จ๊ป˜.

 

 

 

๊ฒฐ๊ณผ๋ฌผ

 

        backgroundImage.layer.cornerRadius = 20
        backgroundView.layer.cornerRadius = 20
        
        backgroundView.layer.shadowColor = UIColor.black.cgColor
        backgroundView.layer.shadowOffset = CGSize(width: 10, height: 10)
        backgroundView.layer.shadowRadius = 10
        backgroundView.layer.shadowOpacity = 0.5
        
        backgroundView.clipsToBounds = false

 

- '๋ชจ์„œ๋ฆฌ๊ฐ€ ์™œ ๋‚˜์™”์ง€?'

  • UIView์—๋„ layer.cornerRadius ์ ์šฉํ•ด์•ผํ•˜๋Š” ๊ฑธ ๋ชฐ๋ž๊ธฐ ๋•Œ๋ฌธ์—. + shadow ์„ค์ •์„ UIView๊ฐ€ ์•„๋‹ˆ๋ผ UIImageView์—๋‹ค๊ฐ€ ํ•ด๋†“์•„์„œ.
  • ๋ฐ”๋กœ IBOutlet์— UIView๋ฅผ ๋งŒ๋“ค๊ณ  ์‹์— ์ถ”๊ฐ€ํ•˜๊ณ  shadow ์„ค์ •์„ UIView๋กœ ๋ฐ”๊พธ๋‹ˆ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฌผ์ด ๋‚˜์™”๋‹ค.

 

 

(3) clipsToBounds

 

-UIview = Super View , UIImageView = Sub View

- clipsToBounds = true ๋กœ ํ•˜๋ฉด ๊ทธ๋ฆผ์ž๊ฐ€ ๋‹ค์‹œ ์‚ฌ๋ผ์ ธ์žˆ๋Š”๋ฐ, ์ด๋Š” UIview์— ์„ค์ •ํ•œ ๊ทธ๋ฆผ์ž ์˜์—ญ์„ ์ณ๋‚ด๋ฒ„๋ฆฌ๊ฒ ๋‹ค!์™€ ๊ฐ™์€ ์˜๋ฏธ๋ผ์„œ false๋กœ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ํ•จ์ˆ˜ ์‹ ๋ง๊ณ ๋„ ์ธ์ŠคํŽ™ํ„ฐ ์˜์—ญ์—์„œ๋„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

โ—๏ธ๋‚˜์ค‘์— ์ˆ˜์ •(๊ฐœ์„ )ํ•ด์•ผํ•˜๋Š” ๋ถ€๋ถ„

 

 

: ์•„์ง ํ•จ์ˆ˜๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์‘์šฉํ•ด์„œ ์“ฐ์ง€ ๋ชป ํ•ด์„œ ๋งŽ์€ ๋ถ€๋ถ„์ด ์ค‘๋ณต ๋˜๋Š” ์‹์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ •๋ฆฌํ•˜์ง€ ๋ชป ํ•˜๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ.

: ์•„๋ž˜ ์‹์ด ๋ฌธ์ œ์˜ ๋ถ€๋ถ„. Calendar.current.date(byAdding: .day, value:100, to:sender.date) & dateCaountBox100.text ๋ถ€๋ถ„์„ ํ•จ์ˆ˜์‹์œผ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•˜๋ฉด ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ•˜๋‚˜์˜ ์‹์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ํ•จ์ˆ˜๊ฐ€ ์ข€..๋”... ์ต์ˆ™ํ•ด์ง€๋ฉด... ์ˆ˜์ •ํ•ด๋ด์•ผ๊ฒ ๋‹ค.

 

 @IBAction func datePickerValueChanged(_ sender: UIDatePicker) {
        
        print("์•ก์…˜ ์ž˜ ๋จ")
        
        // 100
        
        let result = Calendar.current.date(byAdding: .day, value: 100, to: sender.date)
        
        let format = DateFormatter ()
        format.dateFormat = "yyyy๋…„ MM์›” dd์ผ"
        
        let value = format.string(from: result!)
        
        dateCountBox100.text = value
        
        
    }

 

 

 

 

 

'๐ŸŽ Dev > UIKit' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[UIKit/Storyboard] ํ‚ค๋ณด๋“œ ๋‚ด๋ฆฌ๊ธฐ  (0) 2023.07.30
[UIKit/Storyboard] ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค๋ฅธ ์Šคํ† ๋ฆฌ๋ณด๋“œ ๋ณด๋Š” ๋ฒ•  (0) 2023.07.30
[UIKit/Storyboard] ์•„์šธ๋ › ํ•จ์ˆ˜ (@IBOutlet)๊ณผ ์•ก์…˜ ํ•จ์ˆ˜ (@IBAction)  (0) 2023.07.29
[UIKit/Storyboard] ์”ฌ(Scene)๊ณผ Class ์—ฐ๊ฒฐ  (0) 2023.07.29
[UIKit/Storyboard] Entry Point  (0) 2023.07.23
'๐ŸŽ Dev/UIKit' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [UIKit/Storyboard] ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค๋ฅธ ์Šคํ† ๋ฆฌ๋ณด๋“œ ๋ณด๋Š” ๋ฒ•
  • [UIKit/Storyboard] ์•„์šธ๋ › ํ•จ์ˆ˜ (@IBOutlet)๊ณผ ์•ก์…˜ ํ•จ์ˆ˜ (@IBAction)
  • [UIKit/Storyboard] ์”ฌ(Scene)๊ณผ Class ์—ฐ๊ฒฐ
  • [UIKit/Storyboard] Entry Point
Callie_
Callie_
  • Callie_
    CalliOS
    Callie_
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ
      • ๐ŸŽ APPLE
      • ๐ŸŽ Dev
        • Swift
        • UIKit
        • SwiftUI
        • Issue
        • ๊ตฌํ˜„
      • ๐ŸŽ Design
        • HIG
      • โš™๏ธ CS
      • ๐Ÿ’ก ์•Œ๊ณ ๋ฆฌ์ฆ˜
        • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
        • ๋ฐฑ์ค€
      • ๐ŸŸ๏ธ ์ง๊ด€๋กœ๊ทธ (์ถœ์‹œ์•ฑ)
        • ์—…๋ฐ์ดํŠธ
      • ๐ŸŒฑ SeSAC iOS 3๊ธฐ
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์ƒ๋ช…์ฃผ๊ธฐ
    Snapshot
    IBAction
    .fullScreen
    CustomView
    modalPresentStyle
    ํ™”๋ฉด์ „ํ™˜
    stroyboard
    ๋„คํŠธ์›Œํฌํ†ต์‹ 
    apply
    SwiftUI
    .OverFullScreen
    IBOutlet
    TableViewCell
    Infoํƒญ
    TapGestureRecognizer
    SeSAC
    cornerradius
    Enum
    Swift
    assets
    DidEndOnExit
    layer.shadow
    ios
    DiffableDataSource
    Entry Point
    diffable
    clipsToBound
    addTarget
    CocoaTouchFramework
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Callie_
[UIKit/Storyboard] Shadow vs ClipsToBound
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”