Tôi đang cố gắng xây dựng bộ điều khiển vùng chứa phân chia phức tạp để tạo điều kiện cho hai vùng chứa chiều cao thay đổi, mỗi bộ chứa có bộ điều khiển chế độ xem lồng nhau của riêng chúng. Có một cử chỉ pan toàn cầu trên bộ điều khiển chính cho phép người dùng kéo bất kỳ vị trí nào trong vùng chứa chế độ xem và trượt "dải phân cách" giữa các chế độ xem lên và xuống. Nó cũng có một số logic thông minh vị trí ngưỡng phát hiện rằng sẽ mở rộng hoặc view (hoặc thiết lập lại vị trí chia):Tắt cử chỉ di chuyển vùng chứa của phụ huynh để lồng vào UICollectionView
này hoạt động tốt. Ngoài ra còn có rất nhiều mã để xây dựng cái này, mà tôi rất vui được chia sẻ, nhưng tôi không nghĩ nó có liên quan, vì vậy tôi sẽ bỏ qua nó trong lúc này.
Tôi bây giờ cố gắng để làm phức tạp mọi thứ bằng cách thêm một cái nhìn bộ sưu tập để quan điểm đáy:
tôi đã có thể làm việc nó ra để tôi có thể di chuyển các phân chia xem với một cử chỉ pan quyết định và cuộn chế độ xem bộ sưu tập bằng cách vuốt nhanh ngón tay (cử chỉ vuốt, tôi cho rằng đó là?), nhưng đây thực sự là trải nghiệm phụ: bạn không thể xoay chế độ xem và cuộn bộ sưu tập xem cùng một lúc và hy vọng người dùng thường xuyên lặp lại các cử chỉ tương tự, nhưng khác nhau để kiểm soát chế độ xem là quá khó đối với một tương tác. Để cố gắng giải quyết vấn đề này, tôi đã thử một số giải pháp đại biểu/giao thức trong đó tôi phát hiện vị trí của dải phân cách trong chế độ xem chia tách và bật/tắt canCancelTouchesInView
và/hoặc isUserInteractionEnable
trên chế độ xem bộ sưu tập chế độ xem được mở rộng hoàn toàn. Điều này làm việc đến một điểm, nhưng không phải trong hai trường hợp sau:
- Khi chia chia xem ở vị trí mặc định, nếu người dùng mở rộng đến nơi xem dưới cùng được mở rộng hoàn toàn, hãy tiếp tục mở rộng , chế độ xem bộ sưu tập sẽ bắt đầu cuộn cho đến khi cử chỉ kết thúc.
- Khi bộ chia chế độ xem phân chia ở trên cùng (chế độ xem vùng chứa dưới cùng được mở rộng hoàn toàn) và chế độ xem bộ sưu tập là không phải là ở trên cùng, nếu người dùng kéo xuống, chế độ xem bộ sưu tập sẽ cuộn thay vì bộ chia chia xem , cho đến khi chế độ xem bộ sưu tập đạt đến vị trí trên cùng, tại thời điểm đó, chế độ xem chia tách sẽ trở về vị trí mặc định của nó.
Dưới đây là một phim hoạt hình minh họa hành vi này:
Vì điều này, tôi bắt đầu nghĩ cách duy nhất để giải quyết vấn đề là bằng cách tạo ra một phương pháp đại biểu về quan điểm phân chia cho biết chế độ xem bộ sưu tập khi chế độ xem dưới cùng ở độ cao tối đa, sau đó có thể chặn cử chỉ di chuyển của cha hoặc chuyển tiếp màn hình chạm vào chế độ xem bộ sưu tập thay thế? Nhưng, tôi không chắc chắn làm thế nào để làm điều đó. Nếu tôi đi đúng hướng với một giải pháp, thì câu hỏi của tôi đơn giản là: Làm cách nào để chuyển tiếp hoặc chuyển một cử chỉ pan sang chế độ xem bộ sưu tập và có chế độ xem bộ sưu tập tương tác giống như cách chạm vào bởi nó ở nơi đầu tiên? Tôi có thể làm điều gì đó với các phương pháp pointInside
hoặc touches____
không?
Nếu tôi không thể thực hiện theo cách này, tôi có thể giải quyết vấn đề này bằng cách nào khác?
Cập nhật cho thợ săn tiền thưởng: Tôi đã có một số phân mảnh may mắn tạo ra một phương pháp đại biểu về quan điểm bộ sưu tập, và gọi đó là trên thùng phân chia nhằm thiết lập một tài sản shouldScroll
, do đó tôi có sử dụng một số phương hướng và chảo thông tin định vị để xác định xem cuộn có cuộn hay không. sau đó tôi quay trở lại giá trị này trong phương pháp gestureRecognizer:shouldReceive touch:
đại biểu UIGestureRecognizerDelegate
's:
// protocol delegate
protocol GalleryCollectionViewDelegate {
var shouldScroll: Bool? { get }
}
// shouldScroll property
private var _shouldScroll: Bool? = nil
var shouldScroll: Bool {
get {
// Will attempt to retrieve delegate value, or self set value, or return false
return self.galleryDelegate?.shouldScroll ?? self._shouldScroll ?? false
}
set {
self._shouldScroll = newValue
}
}
// UIGestureRecognizerDelegate method
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
return shouldScroll
}
// ----------------
// Delegate property/getter called on the split view controller and the logic:
var shouldScroll: Bool? {
get {
return panTarget != self
}
}
var panTarget: UIViewController! {
get {
// Use intelligent position detection to determine whether the pan should be
// captured by the containing splitview or the gallery's collectionview
switch (viewState.currentPosition,
viewState.pan?.directionTravelled,
galleryScene.galleryCollectionView.isScrolled) {
case (.top, .up?, _), (.top, .down?, true): return galleryScene
default: return self
}
}
}
này hoạt động OK khi bạn bắt đầu di chuyển, nhưng không hoạt động tốt khi di chuyển được kích hoạt trên quan điểm bộ sưu tập, bởi vì cuộn cử chỉ hầu như luôn luôn ghi đè cử chỉ pan. Tôi tự hỏi nếu tôi có thể dây một cái gì đó lên với gestureRecognizer:shouldRecognizeSimultaneouslyWith:
, nhưng tôi không có được nêu ra.
Bạn có thể chia sẻ mã của mình để kiểm tra hành vi này không? Trong một trong hai trường hợp bạn đã đề cập, có vẻ như collectionView sẽ tiêu thụ các sự kiện chạm cho đến khi bù ngang của nó đạt đến ranh giới của nó có vẻ khá đơn giản. – Lukas
@Lukas Tôi có thể, nhưng tôi không chắc nó sẽ thực sự giúp giải quyết vấn đề - bởi vì rất nhiều được xây dựng bằng IB với các ràng buộc IB, và bởi vì bạn đã biết rằng tôi có phương pháp đại biểu phát hiện cháy chính xác cách bạn đã mô tả: "khi bù ngang đạt đến ranh giới trên của nó, collectionView sẽ tiêu thụ các sự kiện chạm." Tuy nhiên, nếu bạn muốn một số mã, tôi có thể thêm một số '¯ \ _ (ツ) _/¯' – brandonscript