JP모건은 2008년부터 2016년까지 귀금속 선물 시장 조작과 관련하여 9억 2천만 달러의 벌금을 지불하고 범죄 행위를 인정했습니다.
스푸핑이란 ?
1. 거래를 체결할 의사 없이 시세보다 낮은 매도 호가로 대규모 허수주문을 낸 뒤 다른 트레이더가 뒤따라오게 만든다. 이들이 더 낮은 매도 호가를 제시하는 순간 앞선 주문을 취소하고 같은 가격의 매수 주문을 해 우선 계약을 체결한다.
2. 반대로 매도 시에는 시세보다 높은 매수 주문을 한 뒤 다른 트레이더들이 따라오면 앞선 주문을 철회하고 같은 가격의 매도 호가를 내놓는 과정을 거친다.
스푸핑의 실체:
JP모건 트레이더들은 최소 8년간 금, 은, 백금, 팔라듐 선물 시장에서 수십만 건의 가짜 주문을 냈으며, 이는 시장 참여자들을 속이기 위한 허위 수요/공급 신호였습니다.
전직 트레이더 Christian Trunz의 증언에 따르면, 수석 트레이더 Gregg Smith는 컴퓨터 마우스를 매우 빠르게 클릭하여 가짜 주문을 넣고 취소했으며, 동료들은 그의 손가락에 얼음을 대야 할 정도라고 농담했습니다
처벌 내역:
CFTC 역사상 최대 규모의 벌금: 총 9억 2,020만 달러 (배상금 3억 1,173만 달러 + 몰수금 1억 7,203만 달러 + 민사 벌금 4억 3,643만 달러)
JP모건 트레이더 John Edmonds는 2018년 10월 상품 사기 및 공모 혐의로 유죄를 인정했습니다.
2. 음모론의 핵심 : 물리적 은(Silver) 축적
거대한 은 보유량 :
2012년 초 500만 온스 미만이었던 JP모건의 물리적 은 보유량은 2015년까지 5,500만 온스 이상으로 증가했습니다.
2019년 기준 JP모건은 1억 3,310만 온스의 물리적 은을 보유하여 세계 기록을 세웠으며, COMEX 은 재고의 50%를 차지했습니다.
일부 분석가들은 JP모건이 평균 온스당 약 20달러의 비용으로 최소 6억 온스의 물리적 은을 축적했다고 계산합니다.
축적 전략 :
2015-2016년 동안 JP모건의 COMEX 하우스 계정은 순(net) 기준으로 약 5,100만 온스의 은을 축적했습니다.
2018년 6월부터 10월 1일 사이, JP모건은 2억 온스의 페이퍼 숏 포지션을 매각하고 물리적 온스를 위한 자금을 확보했으며, 이는 역사상 처음으로 JP모건이 물리적과 페이퍼 은 모두에서 롱 포지션을 취한 것입니다.
3. 음모론의 주장들
가격 조작 의혹 :
JP모건이 COMEX에서 거의 절반의 숏 포지션을 보유하고 있었으며, 이는 본질적으로 "페이퍼 시장"입니다.
JP모건은 페이퍼 시장에서 가격을 낮게 유지하면서 동시에 막대한 물리적 은을 축적했다는 주장이 있습니다.
Hunt Brothers와 비교 :
1979-1980년 Hunt Brothers는 최소 10억 달러 상당의 약 3,500만 온스의 은을 구매하여 가격을 온스당 거의 50달러까지 끌어올렸지만, 1980년 3월 27일 마진콜을 놓쳐 은 가격이 11달러로 폭락한 "Silver Thursday"로 끝났습니다.
Hunt Brothers는 물리적 은 대신 페이퍼 은 계약을 레버리지했기 때문에 실패했지만, JP모건은 Hunt Brothers의 실수에서 배워 물리적 은을 축적한 것으로 보입니다.
4. 반론과 현실
전문가들의 회의적 시각 :
CPM Group의 Jeffrey Christian은 "물리적 은에 투자하는 사람들의 90% 이상은 음모론에 빠져있지 않으며, 그들에게 은은 투자가 아니라 종교와 같다"고 논평했습니다.
Metals Focus의 Philip Newman은 "그들의 출발 전제는 시장이 조작되고 있어서 진정한 은 가격을 보지 못한다는 것이지만, 우리는 그 견해에 동의하지 않는다"고 말했습니다.
스푸핑의 한계 :
규제 당국은 JP모건의 스푸핑 활동이 시장을 왜곡했다고 판단했지만, JP모건이 시간이 지남에 따라 특정 은 가격을 설정하거나 유지했다는 결론은 내리지 않았습니다.
스푸핑은 장기적으로 가격에 영향을 미치지 않으며, 일시적으로 가격 신호를 왜곡하여 트레이더가 다른 시장 참여자를 속여 너무 많이 지불하거나 너무 적게 청구하도록 만드는 것입니다.
5. 현재 상황과 전망
2021년 Reddit "Silver Squeeze" :
GameStop 사태 이후 Reddit의 WallStreetBets와 Silverbugs 커뮤니티는 JP모건을 "처벌"하기 위한 캠페인을 시작했으며, 물리적 은을 대량 구매하여 은행을 "무너뜨리자"는 바이럴 운동이 인터넷에서 확산되었습니다.
미래 시나리오 :
Ted Butler 애널리스트는 "JP모건은 지난 7년간 물리적 은을 축적하는 데 사용한 수단과 기만을 고려할 때, 가능한 최고가로 보유 자산을 분배하는 것을 지켜보는 것은 역사책에 남을 일이 될 것"이라고 주장합니다.
6. 결론
JP모건의 범죄는 실제였고, 역사상 최대 규모의 시장 조작 벌금이 부과되었습니다. 하지만 대규모 은 가격 억제 음모론은 입증되지 않았으며, 전문가들은 회의적입니다. 다만 JP모건의 막대한 물리적 은 축적은 사실이며, 이는 향후 은 시장에 중대한 영향을 미칠 가능성이 있습니다.
20년간 금과 은의 가격비교를 해보면, 1.12~ 2.1%(코로나 시절 최대) 사이에서 평균 1.2~1.4 구간에서 동반 상승 중이라 음모론을 거론하기 애매함. 다만, 경제는 정치적, 사회적인 영향도 미치기에 금을 대량 보유하고 있는 중국, 러시아를 대항하기 위해 어떻게 될지는 확신할 수 없습니다.
워렌버핏도 금은은 싫다고 했지만, 결국 투자를 했음....
워렌버핏이 2020년에 세계 2위 금광업체인 배릭골드(Barrick Gold·티커 GOLD)사의 지분 1.2%를 매입. 매입금액은 당시 5억65백만달러(현재기준 대략 8,200억원)
* EUV, DUV는 모두 반도체 미세회로를 그리는 노광 공정에 사용되는 기술로, EUV가 파장이 DUV의 1/14로 7nm미만은 EUV를 써야 함. DUV가 붓으로 여러번 칠하면서 세밀화를 그린다면, EUV는 초정밀 프린트로 한번에 찍어 내기에 빠르고, 수율이 높아 생산성이 높음(수율이 낮다는 것은 사용하지 못하는 부분이 많다는 것)
3. 투자현황
중국 정부는 2024년 5월 대기금(국가집적회로산업투자기금) 3기를 약 3,440억 위안(약 66조원) 규모로 조성하여 역대 최대 규모의 투자를 진행 중
4. 향후 전망
전문가들은 중국이 레거시 칩과 자동차/가전용 반도체 영역에서는 빠르게 자급률을 높일 것이나, 첨단 AI 칩과 고성능 메모리 분야에서는 당분간 미국·한국과의 격차가 유지될 것으로 보고 있습니다.
중국 반도체 굴기는 장기적 투자 테마이긴 하지만, 정치적 변수(미국 규제 강화)와 기술적 한계로 단기 수익보다는 10년 이상의 긴 호흡으로 봐야 함
시진핑이 장기집권을 하면서 최근 '영수'가 됨.. 그에 따라 뭔가를 보여주기 위해 최근 민영회사를 국영으로 전환하고, 중국일대로 벌어들이고 있는 돈을 엄청 쏟아붓고 있음.. 물론 중국의 콴시구조로 1000억을 투자하면, 여러 단계에 걸쳐 마지막 사업자에게 얼마 들어갈지는 알 수 없지만.(100억?).... 그래도 많은 지원이 있어, 여러 인재들을 끌어들이고 기술 자립을 하고 있어 무시하기 힘듬.
중국은 중국내 정치, 미중의 관계 등 복잡하고, 강하게 얽혀있어 신중하게 접근할 필요 있음.
2025년 11월 6일, OpenAI의 최고재무책임자(CFO) 사라 프라이어(Sarah Friar)가 월스트리트저널(WSJ) 테크 라이브 컨퍼런스에서 한 발언이 실리콘밸리에 폭탄을 투하했습니다.
"우리는 은행, 사모펀드, 그리고 정부까지 포함한 생태계를 구축하려 합니다.정부의 보증(backstop, guarantee)이 있다면 금융 비용을 크게 낮추고, 부채 조달 여력도 늘릴 수 있습니다."
문제는이 발언이 "OpenAI가 실패하면 납세자 세금으로 메우겠다"는 의미로 해석됐다는 점입니다.
* backstop이 문제임 : 폐업직전의 거의 망한 회사한테 해주는 정부보증인데, 오픈AI의 사용자가 1억명가까이 빠르게 증가했는데, 이후 변화가 없고, 경쟁 서비스도 많아지고 있음.... 장기적으로 AI 인프라 투자비용이 회수가 가능할지? 구독료 인상이 지금 보다 2배 이상 인상하거나 기업용 시장 확대가 빨리 올 수 있을지가.. 관건임..
💥 역풍의 시작
발언이 공개되자 즉각적인 반발이 쏟아졌습니다.
트럼프 행정부 고문인 데이비드 색스(David Sacks)는 X(구 트위터)에 다음과 같이 못박았습니다:
"정부의 구제금융은 없다. 한 기업이 실패하면 다른 기업이 그 자리를 채울 것이다."
존스 트레이딩(Jones Trading)의 마이크 오루크(Mike O'Rourke) 수석 전략가는 더욱 신랄했습니다
"OpenAI 내부자들이 미국 정부가 특혜 금리를 제공하고, 자신들은 미국 납세자를 등에 업고 주식 가치를 키우겠다고 생각한다는 게 말도 안 됩니다."
🚨 긴급 진화에 나선 OpenAI
논란이 커지자 OpenAI는 빠르게 대응에 나섰습니다.
"제 발언을 명확히 하겠습니다. OpenAI는 인프라 투자에 대한 정부 보증을 요청하지 않습니다. 'backstop'이라는 단어 선택이 요지를 흐렸습니다. 제가 말하고자 했던 것은 미국의 기술력은 실제 산업 역량 구축에서 나오며, 이는 민간 부문과 정부가 각자의 역할을 해야 한다는 점이었습니다."사라 프라이어 CFO의 입장 정리 (링크드인) "우리는 OpenAI 데이터센터에 대한 정부 보증을 원하지도, 받지도 않습니다.정부가 승자와 패자를 골라서는 안 되며, 납세자가 잘못된 경영 결정을 한 기업을 구제해서는 안 된다고 믿습니다."
- 샘 올트먼 CEO의 장문 해명 (X)
올트먼은 다만 반도체 공장(fab) 건설에 대한 대출 보증은 논의된 바 있다고 덧붙였습니다.
이는 정부가 먼저 요청한 국가 안보 차원의 프로젝트라는 점을 강조한 것입니다.
📊 숫자로 보는 OpenAI의 현실
수익 현황
2025년 예상 매출: 약 120억 달러 (연 환산 기준)
2030년 목표: 수천억 달러 규모
현재 상태: 여전히 적자 지속 중
투자 규모 (현기증 날 정도의 숫자들)
향후 8년간 총 투자 계획: 약 1.4조 달러
2025년 한 해 인프라 투자: 약 1조 달러
오라클과의 파트너십: 3,000억 달러
스타게이트 프로젝트(오라클+소프트뱅크): 5,000억 달러
코어위브와 5년 계약: 119억 달러
비용 구조
일일 운영비: 약 7억 원 추정 (2023년 기준)
주요 비용 항목: AI 칩, 데이터센터, 전력, 연구개발
🤔 왜 이런 일이 벌어졌을까?
1. AI 인프라의 특수성
AI 칩과 데이터센터는 일반 산업 설비와 다릅니다:
빠른 감가상각: 최신 칩이 2~3년마다 교체
불확실한 수명: 기술 발전 속도 예측 불가
천문학적 비용: 최첨단 칩은 개당 수천만 원
이런 특성 때문에 전통적인 담보 대출이 어렵습니다. 은행 입장에서는 "2년 뒤 가치가 얼마나 될지 모르는 자산"을 담보로 큰돈을 빌려주기 부담스럽죠.
2. 수익성의 딜레마
프라이어 CFO는 이렇게 말했습니다:
"투자 속도만 조절하면 우리는 곧바로 흑자 전환이 가능합니다. 하지만 그렇게 하지 않는 이유는 성장이 우선이기 때문입니다."
전형적인 스타트업의 딜레마입니다. 수익을 내려면 투자를 줄여야 하는데, 투자를 줄이면 경쟁에서 밀릴 수 있다는 공포가 있죠.
3. 경쟁 구도
AI 시장은 승자독식 구조입니다:
Anthropic (Claude)
Google (Gemini)
Meta (Llama)
중국의 DeepSeek (최근 충격파)
한 발 늦으면 다 따라잡힙니다. 그래서 OpenAI는 적자를 감수하고라도 공격적으로 투자하고 있습니다.
1. 이미지를 배치하고, "Aspect Fit"으로 설정하면, 사진이 찌그러지는 것을 막기 위해 비율에 맞게 표시할 수 있다. 다만 여백이 생길 수 있는데, 이때... "Background"으로 [System grouped Background Color] 색상을 설정하면, 이미지가 비율에 맞게 보일 때 남는 여백을 표시할 수 있다.
2. 카메라 테스트는 iOS 시뮬레이터에서 할수 없어서, 기기에 옮겨서 해야 하는데, 이때 개발자 라이선스 등록이 되어야 한다. 카메라, GPS, 자이로센서, 조도 센서, 블루투스 등의 동작을 확인하려면 기기에서 직접 동작해 봐야 한다.
3. 카메라 사용권한! [info.plist] 파일에서 [Main storyboard file base name]을 + 클릭한다. 그리고 Privcy라고 입력하면, 관련키 목록이 나타난다. 여기서 [Privacy - Camera Usage Description]을 선택한다. 같은 방법은 - 마이크로폰 접근키 : Privacy - Microphone Usage Description - 포토라이브러리 저장키 : Privacy - Phto Libary Additions Usage Description - 포토라이브러리 접근키 : Privacy - Photo Library Usage Description 을 추가한다. 그러면, 다음 실행할때, 권한 승인 여부를 확인하는 창이 뜬다.
4. 사진이나 비디오 촬영을 하거나 포토 라이브러리에서 선택을 끝났을 때, 호출되는 didFinishPickingMediaWithInfo()메소드를 구현하여, 선택한 이미지나 동영상이 재생되도록한다.
5. 사진이나 비디오 촬영을 취소하거나, 포토 라이브러리에서 선택을 하지 않았을 때, 호출되는 imagePickerControllerDidCancel()메소드를 구현하여, 선택한 이미지나 동영상이 재생되도록한다.
6. iOS 시뮬레이터에서 멀티 터치를 테스트하려면, option키를 눌러야 동시 터치가 가능합니다.
/****
핀치 제스쳐를 이용해서 이미지와 폰트 크기를 변화시키는 예제코드
시뮬레이터에서 테스트시 option키를 누른 상태에서 키패드를 조작해야 멀티-터치가 됨
****/
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var lblPinch: UILabel!
var initialFontSize : CGFloat!
@IBOutlet weak var imgView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let pinch = UIPinchGestureRecognizer(target: self, action: #selector(ViewController.doPinch(_:)))
self.view.addGestureRecognizer(pinch)
let pinchImage = UIPinchGestureRecognizer(target: self, action: #selector(ViewController.doPinchImage(_:)))
self.view.addGestureRecognizer(pinchImage)
}
@objc func doPinch(_ pinch : UIPinchGestureRecognizer) {
if pinch.state == UIPinchGestureRecognizer.State.began {
initialFontSize = lblPinch.font.pointSize
} else {
lblPinch.font = lblPinch.font.withSize(initialFontSize * pinch.scale)
}
}
@objc func doPinchImage(_ pinch : UIPinchGestureRecognizer) {
imgView.transform = imgView.transform.scaledBy(x: pinch.scale, y: pinch.scale)
pinch.scale = 1
}
}
2. 이벤트를 정의할 때, 명시한 #selector에 들어가는 함수를 정의합니다.(이벤트 수행할 내용 정의)
@objc func respondToSwipeGuesture(_ gesture : UIGestureRecognizer) {
if let swipeGuesture = gesture as? UISwipeGestureRecognizer {
imgViewUp.image = imgUp[0]
imgViewDown.image = imgDown[0]
imgViewRight.image = imgRight[0]
imgViewLeft.image = imgLeft[0]
switch swipeGuesture.direction {
case UISwipeGestureRecognizer.Direction.up :
imgViewUp.image = imgUp[1]
case UISwipeGestureRecognizer.Direction.down :
imgViewDown.image = imgDown[1]
case UISwipeGestureRecognizer.Direction.right :
imgViewRight.image = imgRight[1]
case UISwipeGestureRecognizer.Direction.left :
imgViewLeft.image = imgLeft[1]
default :
break
}
}
}
3. 테스트
멀티 터치로 변경하려면, let numOfTouches = 2 를 선언한 후, 이벤트 등록할때 numberOfTouchesRequired의 속성에 대입하면 됩니다. iOS시뮬레이터에서 테스트 할 경우, 'option' 키를 누르면 멀티 터치가 가능합니다. 다만, 두개의 터치가 기본값으로 반대 방향으로 이동하므로, 'option'키와 'shift' 키를 동시에 누르면서 이동하면 제대로 멀티 터치 - Swipe 테스트를 할 수 있습니다.
전체 소스입니다.
// Swipe를 구현하고, 멀티터치를 인지할 수있음
// 싱글터치와 멀티터치를 구분하려면, 이소스 말고, 다음의 멀티터치 소스 확인 필요
import UIKit
class ViewController: UIViewController {
/* 멀티터치를 스와이프를 하려면, numberOfTouchesRequired 속성이 필요한데,
이속석에 numOfTouches = 2 의 값을 대입해야 합니다.
시뮬레이터에서 'option' 키를 누르고 테스트하면, 두개의 동그라미가 반대로 향하므로
option키와 shift 키를 동시에 누르면서 움직이면, 멀티 터치가 됩니다.*/
let numOfTouches = 2
@IBOutlet weak var imgViewUp: UIImageView!
@IBOutlet weak var imgViewDown: UIImageView!
@IBOutlet weak var imgViewLeft: UIImageView!
@IBOutlet weak var imgViewRight: UIImageView!
var imgLeft = [UIImage] ()
var imgRight = [UIImage] ()
var imgUp = [UIImage] ()
var imgDown = [UIImage] ()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
imgUp.append(UIImage(named: "arrow.up.png")!)
imgDown.append(UIImage(named: "arrow.down.png")!)
imgRight.append(UIImage(named: "arrow.right.png")!)
imgLeft.append(UIImage(named: "arrow.left.png")!)
imgUp.append(UIImage(named: "arrow.up.black.png")!)
imgDown.append(UIImage(named: "arrow.down.black.png")!)
imgRight.append(UIImage(named: "arrow.right.black.png")!)
imgLeft.append(UIImage(named: "arrow.left.black.png")!)
imgViewUp.image = imgUp[0]
imgViewDown.image = imgDown[0]
imgViewRight.image = imgRight[0]
imgViewLeft.image = imgLeft[0]
let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGuesture(_:)))
swipeUp.direction = UISwipeGestureRecognizer.Direction.up
// multi-touch swipe
swipeUp.numberOfTouchesRequired = numOfTouches
self.view.addGestureRecognizer(swipeUp)
let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGuesture(_:)))
swipeDown.direction = UISwipeGestureRecognizer.Direction.down
// multi-touch swipe
swipeDown.numberOfTouchesRequired = numOfTouches
self.view.addGestureRecognizer(swipeDown)
let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGuesture(_:)))
swipeRight.direction = UISwipeGestureRecognizer.Direction.right
// multi-touch swipe
swipeRight.numberOfTouchesRequired = numOfTouches
self.view.addGestureRecognizer(swipeRight)
let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGuesture(_:)))
swipeLeft.direction = UISwipeGestureRecognizer.Direction.left
// multi-touch swipe
swipeLeft.numberOfTouchesRequired = numOfTouches
self.view.addGestureRecognizer(swipeLeft)
}
@objc func respondToSwipeGuesture(_ gesture : UIGestureRecognizer) {
if let swipeGuesture = gesture as? UISwipeGestureRecognizer {
imgViewUp.image = imgUp[0]
imgViewDown.image = imgDown[0]
imgViewRight.image = imgRight[0]
imgViewLeft.image = imgLeft[0]
switch swipeGuesture.direction {
case UISwipeGestureRecognizer.Direction.up :
imgViewUp.image = imgUp[1]
case UISwipeGestureRecognizer.Direction.down :
imgViewDown.image = imgDown[1]
case UISwipeGestureRecognizer.Direction.right :
imgViewRight.image = imgRight[1]
case UISwipeGestureRecognizer.Direction.left :
imgViewLeft.image = imgLeft[1]
default :
break
}
}
}
}
5. 멀티 터치와 싱글 터치 구분
위의 예제는 numberOfTouchesRequired에 값을 2를 대입하여, 싱글 또는 멀치 터치를 인식하는 것이라면, 아래의 소스는 멀티 터치에 대한 이벤트, 싱글터치에 대한 이벤트를 각각 등록하고 정의한 예입니다.
// 멀티터치와 싱글터치를 구분할 수 있는 Swipe 예제.
import UIKit
class ViewController: UIViewController {
/* 멀티터치를 스와이프를 하려면, numberOfTouchesRequired 속성이 필요한데,
이속석에 numOfTouches = 2 의 값을 대입해야 합니다.
시뮬레이터에서 'option' 키를 누르고 테스트하면, 두개의 동그라미가 반대로 향하므로
option키와 shift 키를 동시에 누르면서 움직이면, 멀티 터치가 됩니다.*/
let numOfTouches = 2
@IBOutlet weak var imgViewUp: UIImageView!
@IBOutlet weak var imgViewDown: UIImageView!
@IBOutlet weak var imgViewLeft: UIImageView!
@IBOutlet weak var imgViewRight: UIImageView!
var imgLeft = [UIImage] ()
var imgRight = [UIImage] ()
var imgUp = [UIImage] ()
var imgDown = [UIImage] ()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
imgUp.append(UIImage(named: "arrow.up.png")!)
imgDown.append(UIImage(named: "arrow.down.png")!)
imgRight.append(UIImage(named: "arrow.right.png")!)
imgLeft.append(UIImage(named: "arrow.left.png")!)
imgUp.append(UIImage(named: "arrow.up.black.png")!)
imgDown.append(UIImage(named: "arrow.down.black.png")!)
imgRight.append(UIImage(named: "arrow.right.black.png")!)
imgLeft.append(UIImage(named: "arrow.left.black.png")!)
imgUp.append(UIImage(named: "arrow.up.green.png")!)
imgDown.append(UIImage(named: "arrow.down.green.png")!)
imgRight.append(UIImage(named: "arrow.right.green.png")!)
imgLeft.append(UIImage(named: "arrow.left.green.png")!)
imgViewUp.image = imgUp[0]
imgViewDown.image = imgDown[0]
imgViewRight.image = imgRight[0]
imgViewLeft.image = imgLeft[0]
let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGuesture(_:)))
swipeUp.direction = UISwipeGestureRecognizer.Direction.up
self.view.addGestureRecognizer(swipeUp)
let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGuesture(_:)))
swipeDown.direction = UISwipeGestureRecognizer.Direction.down
self.view.addGestureRecognizer(swipeDown)
let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGuesture(_:)))
swipeRight.direction = UISwipeGestureRecognizer.Direction.right
self.view.addGestureRecognizer(swipeRight)
let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGuesture(_:)))
swipeLeft.direction = UISwipeGestureRecognizer.Direction.left
self.view.addGestureRecognizer(swipeLeft)
let swipeUpMulti = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGuestureMulti(_:)))
swipeUpMulti.direction = UISwipeGestureRecognizer.Direction.up
swipeUpMulti.numberOfTouchesRequired = numOfTouches
self.view.addGestureRecognizer(swipeUpMulti)
let swipeDownMulti = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGuestureMulti(_:)))
swipeDownMulti.direction = UISwipeGestureRecognizer.Direction.down
swipeDownMulti.numberOfTouchesRequired = numOfTouches
self.view.addGestureRecognizer(swipeDownMulti)
let swipeRightMulti = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGuestureMulti(_:)))
swipeRightMulti.direction = UISwipeGestureRecognizer.Direction.right
swipeRightMulti.numberOfTouchesRequired = numOfTouches
self.view.addGestureRecognizer(swipeRightMulti)
let swipeLeftMulti = UISwipeGestureRecognizer(target: self, action: #selector(ViewController.respondToSwipeGuestureMulti(_:)))
swipeLeftMulti.direction = UISwipeGestureRecognizer.Direction.left
swipeLeftMulti.numberOfTouchesRequired = numOfTouches
self.view.addGestureRecognizer(swipeLeftMulti)
}
@objc func respondToSwipeGuesture(_ gesture : UIGestureRecognizer) {
if let swipeGuesture = gesture as? UISwipeGestureRecognizer {
imgViewUp.image = imgUp[0]
imgViewDown.image = imgDown[0]
imgViewRight.image = imgRight[0]
imgViewLeft.image = imgLeft[0]
switch swipeGuesture.direction {
case UISwipeGestureRecognizer.Direction.up :
imgViewUp.image = imgUp[1]
case UISwipeGestureRecognizer.Direction.down :
imgViewDown.image = imgDown[1]
case UISwipeGestureRecognizer.Direction.right :
imgViewRight.image = imgRight[1]
case UISwipeGestureRecognizer.Direction.left :
imgViewLeft.image = imgLeft[1]
default :
break
}
}
}
@objc func respondToSwipeGuestureMulti(_ gesture : UIGestureRecognizer) {
if let swipeGuesture = gesture as? UISwipeGestureRecognizer {
imgViewUp.image = imgUp[0]
imgViewDown.image = imgDown[0]
imgViewRight.image = imgRight[0]
imgViewLeft.image = imgLeft[0]
switch swipeGuesture.direction {
case UISwipeGestureRecognizer.Direction.up :
imgViewUp.image = imgUp[2]
case UISwipeGestureRecognizer.Direction.down :
imgViewDown.image = imgDown[2]
case UISwipeGestureRecognizer.Direction.right :
imgViewRight.image = imgRight[2]
case UISwipeGestureRecognizer.Direction.left :
imgViewLeft.image = imgLeft[2]
default :
break
}
}
}
}