Swift에서 UIImageView 개체에 대한 작업을 할당하는 방법
할당하려고 합니다.UIImageView
사용자가 탭할 때 액션으로 이동합니다.
작업 생성 방법을 알고 있습니다.UIButton
하지만 어떻게 같은 동작을 흉내 낼 수 있을까요?UIButton
, 단,UIImageView
?
필요한 것은,UITapGestureRecognizer
. 를 설정하려면 , 다음과 같이 합니다.
override func viewDidLoad()
{
super.viewDidLoad()
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizer:)))
imageView.isUserInteractionEnabled = true
imageView.addGestureRecognizer(tapGestureRecognizer)
}
@objc func imageTapped(tapGestureRecognizer: UITapGestureRecognizer)
{
let tappedImage = tapGestureRecognizer.view as! UIImageView
// Your action
}
(또한UIButton
텍스트 없이 단순히 연결만 하는 것이 아니라 이미지를 지정합니다.IBAction
)
제스처 인식기를 다음에 추가해야 합니다(탭의 경우 UITAPGestureRecognizer를 사용하고, 탭 및 유지의 경우 UELongPressGestureRecognizer를 사용합니다).UIImageView
.
let tap = UITapGestureRecognizer(target: self, action: #selector(YourClass.tappedMe))
imageView.addGestureRecognizer(tap)
imageView.isUserInteractionEnabled = true
그리고 다음과 같은 셀렉터 방식을 구현합니다.
@objc func tappedMe()
{
println("Tapped on Image")
}
를 추가할 수 있습니다.UITapGestureRecognizer
imageView에 1개만 드래그하면 Storyboard/xib에 삽입할 수 있습니다.또한 Ctrl+Drag를 사용하여 imageView에서 gestureRecognizer로, Ctrl+Drag을 사용하여 gestureRecognizer에서Swift 파일로 드래그하면,IBAction
.
또, 유저의 조작을 유효하게 할 필요가 있습니다.UIImageView
(다음 이미지와 같이)
Swift의 경우:
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let tap = UITapGestureRecognizer(target: self, action: #selector(ViewController.tappedMe))
imageView.addGestureRecognizer(tap)
imageView.isUserInteractionEnabled = true
}
func tappedMe() {
print("Tapped on Image")
}
Swift4 코드
몇 가지 새로운 확장 방법을 사용해 보십시오.
import UIKit
extension UIView {
fileprivate struct AssociatedObjectKeys {
static var tapGestureRecognizer = "MediaViewerAssociatedObjectKey_mediaViewer"
}
fileprivate typealias Action = (() -> Void)?
fileprivate var tapGestureRecognizerAction: Action? {
set {
if let newValue = newValue {
// Computed properties get stored as associated objects
objc_setAssociatedObject(self, &AssociatedObjectKeys.tapGestureRecognizer, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
}
}
get {
let tapGestureRecognizerActionInstance = objc_getAssociatedObject(self, &AssociatedObjectKeys.tapGestureRecognizer) as? Action
return tapGestureRecognizerActionInstance
}
}
public func addTapGestureRecognizer(action: (() -> Void)?) {
self.isUserInteractionEnabled = true
self.tapGestureRecognizerAction = action
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTapGesture))
self.addGestureRecognizer(tapGestureRecognizer)
}
@objc fileprivate func handleTapGesture(sender: UITapGestureRecognizer) {
if let action = self.tapGestureRecognizerAction {
action?()
} else {
print("no action")
}
}
}
이제 언제든지 추가하고자 할 때UITapGestureRecognizer
에 대해서UIView
또는UIView
같은 서브클래스UIImageView
셀렉터에 관련된 함수를 만들지 않아도 됩니다.
사용방법:
profile_ImageView.addTapGestureRecognizer {
print("image tapped")
}
실제로 그 이미지를 설정할 수 있습니다.UIButton
그 안에 보통 넣을 수 있는 것까지UIImageView
예를 들어 다음과 같은 작업을 수행할 수 있습니다.
myImageView.image = myUIImage
대신 다음을 사용할 수 있습니다.
myButton.setImage(myUIImage, forState: UIControlState.Normal)
코드는 다음과 같습니다.
override func viewDidLoad(){
super.viewDidLoad()
var myUIImage: UIImage //set the UIImage here
myButton.setImage(myUIImage, forState: UIControlState.Normal)
}
@IBOutlet var myButton: UIButton!
@IBAction func buttonTap(sender: UIButton!){
//handle the image tap
}
이 방법을 사용하면 데이터베이스에서 이미지를 로드해야 할 경우 이미지를 설정하기 전에 버튼의 제목을 설정할 수 있습니다.
myButton.setTitle("Loading Image...", forState: UIControlState.Normal)
이미지를 로드하고 있음을 사용자에게 알리려면
TapGestureRecognizer를 등록하려면 지연을 추가해야 합니다.
UITapGestureRecognizer(타겟: self...)의 'self'는 게으른 var가 아니면 0이 되므로.isUserInteractionEnable = true를 설정해도 lazy var가 없으면 등록되지 않습니다.
lazy var imageSelector : UIImageView = {
let image = UIImageView(image: "imageName.png")
//now add tap gesture
image.isUserInteractionEnabled = true
image.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleImageSelector)))
return image
}()
@objc private func handleImageSelector() {
print("Pressed image selector")
}
를 넣을 수 있습니다.UIButton
위에 투명한 배경을 두고UIImageView
이미지를 로드하기 전에 버튼을 탭하는 소리가 들립니다.
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//ViewController is your current view controller
let tap = UITapGestureRecognizer(target: self, action: #selector(ViewController.tappedMe))
imageView.addGestureRecognizer(tap)
imageView.isUserInteractionEnabled = true
}
// Need to ass objective-c annotation
@objc
func tappedMe() {
print("Tapped on Image")
}
Swift 4 코드
순서 1 ViewdidLoad()에서의
let pictureTap = UITapGestureRecognizer(target: self, action: #selector(MyInfoTableViewController.imageTapped))
userImageView.addGestureRecognizer(pictureTap)
userImageView.isUserInteractionEnabled = true
순서 2 다음 기능 추가
@objc func imageTapped() {
let imageView = userImageView
let newImageView = UIImageView(image: imageView?.image)
newImageView.frame = UIScreen.main.bounds
newImageView.backgroundColor = UIColor.black
newImageView.contentMode = .scaleAspectFit
newImageView.isUserInteractionEnabled = true
let tap = UITapGestureRecognizer(target: self, action: #selector(dismissFullscreenImage))
newImageView.addGestureRecognizer(tap)
self.view.addSubview(newImageView)
self.navigationController?.isNavigationBarHidden = true
self.tabBarController?.tabBar.isHidden = true
}
테스트 완료 및 올바르게 동작하고 있습니다.
이미지 뷰에 보이지 않는(불투명도 = 0) 버튼을 배치한 후 버튼에서 상호 작용을 처리하는 것이 좋습니다.
이게 내가 찾은 거야 셋업이 훨씬 쉬워
- 라이브러리를 열고 "Tap Gesture Recognizer" 객체를 찾습니다.
- 오브젝트를 스토리보드로 드래그하고 액션을 트리거할 이미지에 위임자를 설정합니다.
- 그런 다음 뷰 컨트롤러로 이동하여 동일한 개체를 끌어 IBAtion을 설정합니다.
언급URL : https://stackoverflow.com/questions/27880607/how-to-assign-an-action-for-uiimageview-object-in-swift
'source' 카테고리의 다른 글
ListBox 항목을 두 번 클릭하여 브라우저를 엽니다. (0) | 2023.04.11 |
---|---|
각 파일 및 디렉토리의 크기를 나열하고 Bash에서 내림차순으로 정렬하려면 어떻게 해야 합니까? (0) | 2023.04.11 |
Git은 BLOB에서의 SHA-1 충돌에 어떻게 대처합니까? (0) | 2023.04.11 |
NAMED 콘텐츠를 사용하여 WPF UserControl을 작성하는 방법 (0) | 2023.04.11 |
WPF가 현재 설계 모드로 실행되고 있는지 여부를 확인할 수 있는 방법이 있습니까? (0) | 2023.04.11 |