Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.0k views
in Technique[技术] by (71.8m points)

swift - iOS 13 Segmented Control: Remove swipe gesture to select segment

TLDR: How to remove the swipe/pan gesture recognizer for UISegmentedControl on iOS 13?

Hi, on iOS 13, lots changed with UISegmentedControl. Mostly, the changes were appearance-based. But there is another functionality change that is messing up my app.

On iOS 13, with UISegmentedControls, you can now swipe/pan to change the selected segment in addition to touching the segment you would like to select.

In my app, I basically have a UISegmentedControl embedded in a scrollview. The UISegmentedControl is too long for the screen to display all of the values, so I created a scrollview that is the width of the screen, whose content width is the length of the UISegmentedControl, and to access the non-visible segments, the user swipes the "scrollview" and the segmented control slides.

This worked perfectly up until iOS 13, and now, the user can't scroll the horizontal background scrollview while dragging on the segmented control because I am assuming the scrollview scroll recognizer is overridden by the new scrollview swipe to select gesture.

I have tried even removing ALL gesture recognizers for the UISegmentedControl and all of its subviews recursively, and the swipe to change selection gesture still works... I am stuck.

Thanks, let me know if the problem is unclear

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I have a similar setup (UISegmentedControl inside a UIScrollView bc it's too long and the client didn't want to compress the content to fit). This worked for me (Built on Xcode 11.1):

class NoSwipeSegmentedControl: UISegmentedControl {

    override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
}

Then set the class of my UISegmentedControl to that. In my app this only prevents the swipe-to-select gesture on UISegmentedControl objects embedded within a UIScrollView. If it is not in a UIScrollView nothing behaves any differently. Which makes sense because gestureRecognizerShouldBegin() returns true by default. So why this allows the UIScrollView to take priority on the swipe gesture, I have no idea. But hope it helps.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...