UIScrollView가 이상하게 작동하기 때문에 당황 스럽습니다.UIScrollView UITextField/UIPickerView를 사용한 이상한 동작
기본적으로 iOS 차트를 사용하여 일부 그래프를 표시하는 데 사용하는 iPhone 6 높이의 약 두 배인 UIScrollView가 있으므로 세로로 스크롤하고 튀게 설정할 수 있지만 스크롤 할 수 없도록 설정했습니다 수평으로 튀어 나오지 않습니다. 모든 그래프 및 일부 추가 UITextField 및 UILabels는 일반적인 관행 인 것처럼 UIScrollView의 프레임과 정렬되는 별도의 "본문보기"에 포함됩니다. 따라서, 내 뷰의 계층 구조는 다음과 같습니다 : 오늘을 발견 할 때까지
이 잘 작동이 나는 UIPickerView, 내 스크롤 뷰 갑자기 트리거이있는 UIScrollView의 특정의 UITextField를 누를 때 수평 튀는 것을 허용하기 시작합니다. 두 개의 다른 UITextField가 탭되었을 때 본문보기에서이 동작이 발생하지 않습니다.
영향을받는 텍스트 입력란을 두드려서 트리거되는 모든 코드를 확인했지만 UI 개체의 프레임이나 경계를 직접 편집하는 코드는 없습니다. 사실, 텍스트 필드가 탭 될 때 호출되는 유일한 함수는 textFieldDidBeginEditing
입니다. 이 함수에 대한 코드를 아래에 첨부했지만 문제는 아닌 것으로 확신합니다.
내 다음 의심은 UIPickerView가 내 스크롤보기 및/또는 포함 된보기의 크기를 망치고 있다는 것이 었습니다. 나는 이것이 가능할 지/확실한 지 잘 모르겠지만,이 모든 일로 인해 꽤 저주를 받았다. 여기
func textFieldDidBeginEditing(_ textField: UITextField) {
if textField == overallTimeframeTextField {
...
// Not the problematic text field
} else if textField == subjectTimeframeTextField {
...
// Also not the problematic text field
} else { // Affected text field
// Set the text of the text field
if textField.text == "" {
// This is executed in this scenario
textField.text = subjectPickerData[0]
} else {
...
}
}
}
내 문제를 요약 한 짧은 GIF입니다 :
여기 내 코드입니다. 나를 가로 질러 바운스 할 수없는 페이지를 아래로 스크롤 한 다음 텍스트 필드에 태그를 지정하면 갑자기 스크롤 뷰에서 튀어 오르는 것을 볼 수 있습니다.
내가 꽤이 문제를 잃었어요, 그래서 어떤 도움을 주시면 감사하겠습니다. 편집
내가 명시 적으로 원하는 높이와 사용자가 켜져 있는지 화면의 폭과 동일하게 내있는 ScrollView의 내용 크기를 선언 명확합니다. 그런 다음 bodyView의 너비를 동일한 값으로 설정합니다. 나는 또한 모두에있는 ScrollView 및 본문 뷰를 강제로의 UIViewController의 기본 아이 뷰 (내 계층 구조의 스크롤 뷰의 부모와 같은 폭이 제약이
// Fit the content to the screen
scrollView.contentSize = CGSize(width: UIScreen.main.bounds.width, height: 1200)
bodyView.frame.size.width = UIScreen.main.bounds.width
: 이것은 다음 코드로 viewDidAppear
에서 이루어집니다).
내가 눈치 챘을 한 가지 흥미로운 점은 그 뷰로드, 나는 아이폰 6에 대한 다음과 같은 출력받을 때 나는 내 스크롤 뷰의 폭과 내 몸보기를 인쇄 할 때 :
385.0
을385.0
이것은 iPhone 6의 너비와 동일합니다.내가 텍스트 필드를 누른 다음 같은 값을 인쇄 할 때 그러나, 나는이 출력을 얻을 : 어떤 이유로 그래서
385.0
384.0
을, 내 몸보기는 하나입니다 내 스크롤보기보다 작은 포인트. viewDidAppear
함수에서와 같이 텍스트 필드를 탭할 때 본문보기의 너비를 스크롤보기와 동일하게 설정하려고 시도했지만 효과가 없습니다.
, 정말처럼 내 클래스 인스턴스 변수와 pickerview를 초기화 :
var subjectPickerView = UIPickerView()
내가 다음 viewDidLoad
에서 텍스트 필드에 대한 입력보기가이 선택기보기를 할당합니다
textField.inputView = subjectPickerView
이렇게하면이 선택기보기를 스크롤보기의 하위보기로 만들지 모르겠지만이 시나리오에서는 키보드를 바꿀뿐입니다.
귀하의 스크롤 뷰 바운스가 세로로 활성화되어 있습니까? – CodeChanger
@CodeChanger 예, 'bounces'및 'bounces vertically'가 사용 가능하며 'bounces horizontally'가 사용 가능하지 않습니다. –
* "스크롤을하지 않고 수평으로 튀어 나오지 않도록 설정했습니다."* 스크롤 기능은 'contentSize'를 기반으로합니다 --- 명시 적으로 또는 제약 조건으로 설정하고 있습니까? 그리고 당신은 * "UITextField --- UIPickerView를 트리거합니다"라고 말합니다 * 어떻게 피커 뷰를 표시합니까? 스크롤보기의 하위보기입니까? – DonMag