iOS Swift适配阿拉伯语调用stackView.removeArrangedSubview后尺寸异常
问题根因
你的布局异常是两个API调用错误导致的:
removeArrangedSubview只会将视图从stack view的排列管理队列中移除,不会将视图从父视图层级删除,你执行两次移除操作后,两个输入框依然留在stack view上,只是不参与布局计算- 后续你用
insertSubview(_:at:)插入视图,这个方法只会将视图加入父视图层级,不会加入stack view的排列管理队列,stack view不会自动计算这两个输入框的尺寸和位置,最终导致约束冲突、stack view尺寸异常
最优解决方案
无需手动判断语言切换子视图顺序,直接强制stack view固定从左到右排列即可,一步解决所有RTL适配问题:
// 在stack view初始化或视图加载时调用即可 mobiStack.semanticContentAttribute = .forceLeftToRight
这个属性会让stack view忽略系统的RTL布局方向,始终保持从左到右的排列逻辑,完全符合你“国家码始终在手机号码左侧”的需求。
手动调整排列的修正代码
如果你确实需要手动控制子视图顺序,修正后的代码如下:
let language = getObjectFromUserDefault(forKey: userDefaultKeys.getLanguageKey) as? String if KLanguageCode.Arabic.rawValue == language { // 清理旧的排列子视图,同时从父视图移除 for subview in self.mobiStack.arrangedSubviews { self.mobiStack.removeArrangedSubview(subview) subview.removeFromSuperview() } // 用insertArrangedSubview将视图加入排列队列 self.mobiStack.insertArrangedSubview(self.countryCode, at: 0) self.mobiStack.insertArrangedSubview(self.txtMobile, at: 1) }
内容的提问来源于stack exchange,提问作者Ali Madhoun
相关产品推荐
相关产品推荐

