มีตัวเลือกใน IB เพื่อยกเลิกการเลือกการเลื่อนแนวตั้งบนมุมมองแบบเลื่อน แต่ดูเหมือนจะไม่ได้ผล
จะตั้งค่า scrollview ให้เลื่อนในแนวนอนเท่านั้นไม่ใช่แนวตั้งในโค้ดแทน IB ได้อย่างไร
มีตัวเลือกใน IB เพื่อยกเลิกการเลือกการเลื่อนแนวตั้งบนมุมมองแบบเลื่อน แต่ดูเหมือนจะไม่ได้ผล
จะตั้งค่า scrollview ให้เลื่อนในแนวนอนเท่านั้นไม่ใช่แนวตั้งในโค้ดแทน IB ได้อย่างไร
คำตอบ:
ลองตั้งค่าความสูงของ contentSize เป็นความสูงของ scrollView จากนั้นควรปิดการเลื่อนแนวตั้งเพราะจะไม่มีอะไรให้เลื่อนในแนวตั้ง
scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,scrollView.frame.size.height);
ตั้งแต่ iOS7:
อันดับแรก: ความกว้างของขนาดเนื้อหาต้องเท่ากับความกว้างของมุมมองแบบเลื่อนของคุณ
วินาที: ใน initWithNibName ของคุณ:
self.automaticallyAdjustsScrollViewInsets = NO;
แค่นั้นแหละ.
ใช่คำตอบของ pt2ph8 ถูกต้อง
แต่ถ้าด้วยเหตุผลแปลก ๆ contentSize ของคุณควรสูงกว่า UIScrollView คุณสามารถปิดใช้งานการเลื่อนแนวตั้งโดยใช้วิธีโปรโตคอล UIScrollView
-(void)scrollViewDidScroll:(UIScrollView *)aScrollView;
เพียงเพิ่มสิ่งนี้ใน UIViewController ของคุณ
float oldY; // here or better in .h interface
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
[aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, oldY)];
// or if you are sure you wanna it always on top:
// [aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x, 0)];
}
เป็นเพียงวิธีการที่เรียกว่าเมื่อผู้ใช้เลื่อน UIScrollView ของคุณและการทำเช่นนั้นคุณบังคับให้เนื้อหาของมันเหมือนเดิมเสมอ
float oldY;
อ้างถึงโค้ดด้านบน นั่นคือสัญลักษณ์ตัวแปรรูปแบบ C สำหรับต่อแอ็พพลิเคชันตัวแปรต้องถูกประกาศให้เป็นสมาชิกอินสแตนซ์ของคลาสคอนโทรลเลอร์
รวมวิธีการดังต่อไปนี้
-(void)viewDidLayoutSubviews{
self.automaticallyAdjustsScrollViewInsets = NO;
}
และตั้งค่าความกว้างขนาดเนื้อหาของมุมมองเลื่อนให้เท่ากับความกว้างของมุมมองเลื่อน
คุณต้องผ่าน 0 ในขนาดเนื้อหาเพื่อปิดใช้งานในทิศทางที่คุณต้องการ
เพื่อปิดการเลื่อนแนวตั้ง
scrollView.contentSize = CGSizeMake(scrollView.contentSize.width,0);
เพื่อปิดใช้งานการเลื่อนแนวนอน
scrollView.contentSize = CGSizeMake(0,scrollView.contentSize.height);
ฉันอัปเดตขนาดเนื้อหาเพื่อปิดใช้งานการเลื่อนแนวตั้งและความสามารถในการเลื่อนยังคงอยู่ จากนั้นฉันก็พบว่าฉันจำเป็นต้องปิดการใช้งานการตีกลับแนวตั้งด้วยเพื่อปิดใช้งานการเลื่อนโดยสมบูรณ์
อาจจะมีคนมีปัญหานี้เหมือนกัน
- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
[aScrollView setContentOffset: CGPointMake(aScrollView.contentOffset.x,0)];
}
คุณต้องได้รับการยืนยัน UIScrollViewDelegate
aScrollView.delegate = self;
เพียงตั้งค่า y ให้อยู่ด้านบนเสมอ ต้องสอดคล้องกับ UIScrollViewDelegate
func scrollViewDidScroll(scrollView: UIScrollView) {
scrollView.contentOffset.y = 0.0
}
สิ่งนี้จะรักษาเอฟเฟกต์การชะลอตัว / การเร่งความเร็วของการเลื่อน
บน iOS 11 โปรดอย่าลืมเพิ่มสิ่งต่อไปนี้หากคุณสนใจที่จะสร้างมุมมองแบบเลื่อนที่ยึดติดกับขอบเขตหน้าจอแทนที่จะเป็นพื้นที่ปลอดภัย:
if (@available(iOS 11.0, *)) {
[self.scrollView setContentInsetAdjustmentBehavior:UIScrollViewContentInsetAdjustmentNever];
}
จากiOS11เราสามารถใช้คุณสมบัติต่อไปนี้
let frameLayoutGuide: UILayoutGuide
หากคุณตั้งข้อ จำกัด สำหรับframeLayoutGuide.topAnchorและframeLayoutGuide.bottomAnchorเพื่อเบรกเดียวกันของบางsubviewคุณscrollviewแล้วเลื่อนแนวตั้งจะเป็นคนพิการและความสูงของscrollviewจะเท่ากับความสูงของ subview ของตน
วิธีแก้ไขที่ชัดเจนที่สุดคือห้ามไม่ให้มีการเปลี่ยนแปลงพิกัด y ในคลาสย่อยของคุณ
override var contentOffset: CGPoint {
get {
return super.contentOffset
}
set {
super.contentOffset = CGPoint(x: newValue.x, y: 0)
}
}
นี่เป็นทางออกเดียวที่เหมาะสมในสถานการณ์เมื่อ:
คำตอบมากมายรวมถึงการตั้งค่าเป็นcontentOffset
0 ฉันมีกรณีที่ฉันต้องการให้มุมมองภายใน scrollView อยู่ตรงกลาง สิ่งนี้ได้ผลสำหรับฉัน:
public func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.y = -scrollView.contentInset.top
}