xmartlabs / XLPagerTabStrip

Android PagerTabStrip for iOS.
MIT License
6.98k stars 1.33k forks source link

Right to left support #282

Open hrsalehi opened 7 years ago

hrsalehi commented 7 years ago

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 commented 7 years ago

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

hrsalehi commented 7 years ago

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

chandanch commented 7 years ago

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

hrsalehi commented 7 years ago

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 commented 7 years ago

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

mohammadghk commented 7 years ago

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 commented 7 years ago

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

musbaalbaki commented 7 years ago

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

mohammadghk commented 7 years ago

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

nadagamal commented 7 years ago

Hi hrsalehi, Do you solve this issue?

Thank you

musbaalbaki commented 7 years ago

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 commented 7 years ago

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 commented 6 years ago

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

AdnanMajeed06 commented 6 years ago

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 commented 5 years ago

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 commented 5 years ago

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 commented 4 years ago

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 commented 4 years ago

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

AbdelrahmanElabd commented 3 years ago

Any solution for this issue

Wahab-Khan commented 3 years ago

stuck in the same issue ...

Dev-Khaled commented 2 years ago

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)
        }

    }

}
Wahab-Khan commented 2 years ago

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`