Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Right to left support #282

Open
hrsalehi opened this issue Dec 4, 2016 · 22 comments
Open

Right to left support #282

hrsalehi opened this issue Dec 4, 2016 · 22 comments

Comments

@hrsalehi
Copy link

hrsalehi commented Dec 4, 2016

Hi, I just added pager tab strip into one of my controllers and my app local is RTL but the scroll view does not work correctly and since tabs are populated from right to left but controllers populated from left to the right.
To test that just change app default language to one of the RTL languages such as Arabic ,Farsi or Hebrew

@chandanch
Copy link

Hello I changed to español and works perfectly, Can you share the code?

@hrsalehi
Copy link
Author

hrsalehi commented Dec 5, 2016

Isn't español a LTR language? I meant for occasions where view direction changes (mirror) to right to left.

@chandanch
Copy link

I will check for LTR Language(Arabic) and see if it works

@hrsalehi
Copy link
Author

hrsalehi commented Dec 5, 2016

In summary the problem is the tabs works correctly but the scroll view still populate view from left to the right so the rightmost tab show the leftmost view and so on ...

@mtnbarreto
Copy link
Member

@hrsalehi Do you have time to look at it and find out a solution?

@mohammadghk
Copy link

try setting your main ScrollView for PagerTabStrip i.e(container view) view semantic to : Force-Right-To-Left and see if it solves the problem
screen shot 2017-02-14 at 4 33 02 pm

@musbaalbaki
Copy link

Setting force Right-to-Left semantic on the containerView (UIScrollView) did not solve the issue 👎 Any suggestion that might fix this issue please?

@musbaalbaki
Copy link

@santiagofm Do you think anything could be done on this one please?

@mohammadghk
Copy link

One solution is to reverse the tabs array before setting it to the controller @musbaalbaki

@nadagamal
Copy link

Hi hrsalehi,
Do you solve this issue?

Thank you

@musbaalbaki
Copy link

Thanks @mohammadghk, that is actually what I ended up doing. However I am still looking for a cleaner approach using the native iOS RTL support

@Abdul-Hannan
Copy link

Abdul-Hannan commented Aug 9, 2017

since I am using autolayout, the tabs section automatically adjusted in RTL language. Now the problem I am facing is that the view controllers slide in from right side in Arabic which is basically opposite.

@dajdouj10
Copy link

hi,
I have the same problem. Is it a solution
Thank you

@AdnanMajeed06
Copy link

This is not a proper solution but after way too many hours trying to solve this problem, this actually solved it.
Add these lines inside viewDidLoad method in PagerTabStripViewController

    if #available(iOS 9.0, *) {
        if UIView.userInterfaceLayoutDirection(for: view.semanticContentAttribute) == .rightToLeft {
           print("arabic")
            containerView.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi))
            for controller in viewControllers
            {
                controller.view.transform =  CGAffineTransform(rotationAngle: CGFloat(Double.pi));
                
            }
        }
        else
        {
            print("English")
        }
    } else {
        // Fallback on earlier versions
    }

@iMostafaSh
Copy link

This is not a proper solution but after way too many hours trying to solve this problem, this actually solved it.
Add these lines inside viewDidLoad method in PagerTabStripViewController

    if #available(iOS 9.0, *) {
        if UIView.userInterfaceLayoutDirection(for: view.semanticContentAttribute) == .rightToLeft {
           print("arabic")
            containerView.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi))
            for controller in viewControllers
            {
                controller.view.transform =  CGAffineTransform(rotationAngle: CGFloat(Double.pi));
                
            }
        }
        else
        {
            print("English")
        }
    } else {
        // Fallback on earlier versions
    }

Thanks

@alielsokary
Copy link

alielsokary commented Nov 2, 2019

I used @AdnanMajeed06 solution by adding the transform function in ViewDidLoad after super.viewDidLoad and without reversing the tabs array by extending UICollectionViewFlowLayout
like so:

extension UICollectionViewFlowLayout {

	override open var flipsHorizontallyInOppositeLayoutDirection: Bool {
		return true
	}

	override open var developmentLayoutDirection: UIUserInterfaceLayoutDirection {
		return UIUserInterfaceLayoutDirection.rightToLeft
	}
}

The tabs start from right to left and the scrollview direction is working like it supoosed to do in RTL

@mixdesign
Copy link

I ended up with another similar solution, which fixes the unexpected rotation if implemented using @AdnanMajeed06 solution.

My solution:

// Add at the end of `viewDidLoad` of `PagerTabStripViewController`
if UIView.userInterfaceLayoutDirection(for: view.semanticContentAttribute) == .rightToLeft {
    containerView.transform = CGAffineTransform(scaleX: -1, y: 1)
    for controller in viewControllers {
        controller.view.transform = CGAffineTransform(scaleX: -1, y: 1)
    }
}

It works fine with RTL and LTR

@higher-faster-better
Copy link

Nothing works for me and this bug is still open, any new solution here?

@AbdelrahmanElabd
Copy link

Any solution for this issue

@Wahab-Khan
Copy link

stuck in the same issue ...

@Dev-Khaled
Copy link

Dev-Khaled commented Feb 7, 2022

This solution works like a charm

Just add this class to your code RTLBaseButtonBarPagerTabStripViewController, and use it instead of normal BaseButtonBarPagerTabStripViewController

class RTLBaseButtonBarPagerTabStripViewController<ButtonBarCellType: UICollectionViewCell>: BaseButtonBarPagerTabStripViewController<ButtonBarCellType> {
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Fix RTL scrolling issue
        if UIView.userInterfaceLayoutDirection(for: view.semanticContentAttribute) == .rightToLeft {
            containerView.transform = CGAffineTransform(scaleX: -1, y: 1)
        }
    }
    
    // Fix RTL scrolling issue
    override func updateContent() {
        super.updateContent()
        
        if UIView.userInterfaceLayoutDirection(for: view.semanticContentAttribute) == .rightToLeft, viewControllers[currentIndex].view.transform.a != -1 {
            viewControllers[currentIndex].view.transform = CGAffineTransform(scaleX: -1, y: 1)
        }

    }
            
}

This was referenced Feb 16, 2022
@Wahab-Khan
Copy link

for 3 or less than thre tabs follwing code works fine for me ...
self.buttonBarView.semanticContentAttribute = GeneralMethods.getSelectedLanguage() == .arabic ? .forceRightToLeft : .forceLeftToRight

but for more than three tabs above code not working... so I change the logic... XLPagerTabStrip uses CollectionView for top buttons known as buttonBarView ...
So I created a class with name ArabicCollectionFlow

class ArabicCollectionFlow: UICollectionViewFlowLayout { override var flipsHorizontallyInOppositeLayoutDirection: Bool { return GeneralMethods.getSelectedLanguage() == .english ? false : true//AppLanguage.switchToRTL } }

and assign the class to 'buttonBarView'

   `let collectionLayout = ArabicCollectionFlow()
    collectionLayout.scrollDirection = .horizontal
    self.buttonBarView.collectionViewLayout = collectionLayout`

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests