ฉันUIScrollViewมีหลายอันที่มีUIImageViews, UILabels ฯลฯ ... ป้ายกำกับนั้นยาวกว่านั้นUIScrollViewมาก แต่เมื่อฉันเรียกใช้แอพฉันไม่สามารถคลิกและเลื่อนลง ...
เหตุใดจึงเป็นเช่นนี้
ขอบคุณ
ฉันUIScrollViewมีหลายอันที่มีUIImageViews, UILabels ฯลฯ ... ป้ายกำกับนั้นยาวกว่านั้นUIScrollViewมาก แต่เมื่อฉันเรียกใช้แอพฉันไม่สามารถคลิกและเลื่อนลง ...
เหตุใดจึงเป็นเช่นนี้
ขอบคุณ
คำตอบ:
เป็นเรื่องดีเสมอที่จะแสดงข้อมูลโค้ดที่สมบูรณ์
// in viewDidLoad (if using Autolayout check note below):
UIScrollView *myScrollView;
UIView *contentView;
// scrollview won't scroll unless content size explicitly set
[myScrollView addSubview:contentView];//if the contentView is not already inside your scrollview in your xib/StoryBoard doc
myScrollView.contentSize = contentView.frame.size; //sets ScrollView content size
Swift 4.0
let myScrollView
let contentView
// scrollview won't scroll unless content size explicitly set
myScrollView.addSubview(contentView)//if the contentView is not already inside your scrollview in your xib/StoryBoard doc
myScrollView.contentSize = contentView.frame.size //sets ScrollView content size
ฉันไม่ได้พบวิธีการตั้งค่า contentSize ใน IB ( ณ Xcode 5.0)
หมายเหตุ: หากคุณใช้ Autolayout สถานที่ที่ดีที่สุดในการวางรหัสนี้อยู่ใน-(void)viewDidLayoutSubviewsวิธีการ
myScrollView.delegate = selfหากยังไม่ทำงานคำตอบด้านล่างนี้จะมีคำแนะนำที่ดี (ไปที่ xib / StoryBoard ของคุณและตรวจสอบให้แน่ใจว่า "AutoLayout" ปิดใช้งานอยู่) เคล็ดลับ: คุณสามารถรวม<UIScrollViewDelegate>ไว้ในไฟล์. h ของคุณหากคุณต้องการทำสิ่งต่าง ๆ เช่นเลื่อน UIScrollView ของคุณโดยทางโปรแกรม
viewDidLayoutSubviewsทำให้มันใช้งานได้สำหรับฉัน
หากคุณไม่สามารถเลื่อนมุมมองแม้หลังจากที่คุณตั้งcontentSizeอย่างถูกต้องตรวจสอบให้แน่ใจว่าคุณยกเลิกการเลือก "ใช้ AutoLayout" ใน Interface Builder -> ตัวตรวจสอบไฟล์
คุณต้องตั้งค่าcontentSizeคุณสมบัติของมุมมองเลื่อนเพื่อให้เลื่อนได้อย่างถูกต้อง
หากคุณกำลังใช้ autolayout คุณจะต้องตั้งค่าcontentSizeในviewDidLayoutSubviewsเพื่อให้มันจะนำมาใช้หลังจากที่เสร็จสมบูรณ์ autolayout
รหัสอาจมีลักษณะเช่นนี้:
-(void)viewDidLayoutSubviews
{
// The scrollview needs to know the content size for it to work correctly
self.scrollView.contentSize = CGSizeMake(
self.scrollContent.frame.size.width,
self.scrollContent.frame.size.height + 300
);
}
contentSizeเป็นขนาดcontentViewเท่าขนาด scrollView และ contentView ดูเหมือนว่าจะได้รับการตั้งค่าเหมือนกัน แต่การตั้งค่าความสูงของcontentSizeถึงค่ามากกว่าความสูงของcontentViewมันก็ใช้งานได้
viewDidLayoutSubviewsสามารถเรียกหลาย ๆ ครั้งในช่วงอายุการใช้งานดังนั้นคุณจึงเสี่ยงที่จะเพิ่มความสูงได้มากกว่าที่คาดไว้
คำตอบข้างต้นถูกต้อง - เพื่อให้การเลื่อนเกิดขึ้นจำเป็นต้องกำหนดขนาดเนื้อหา
หากคุณใช้ตัวสร้างส่วนต่อประสานวิธีที่ประณีตในการทำเช่นนี้ก็คือการใช้คุณสมบัติของรันไทม์ที่ผู้ใช้กำหนด เช่น:

พยายามปรับขนาดเนื้อหาเป็นตัวเลขขนาดใหญ่ ฉันไม่เข้าใจว่าเพราะเหตุใดมุมมองการเลื่อนของฉันจึงไม่เลื่อนแม้ว่าขนาดเนื้อหาของมันจะใหญ่กว่าขนาดควบคุม ฉันค้นพบว่าถ้าขนาดเนื้อหาเล็กกว่าที่ต้องการก็ไม่สามารถใช้งานได้
self.scrollView.contentSize = CGSizeMake(2000, 2000);
แทนที่จะเป็น 2000 คุณสามารถใส่ตัวเลขขนาดใหญ่ของคุณเอง และถ้าใช้งานได้แสดงว่าขนาดเนื้อหาของคุณไม่ใหญ่พอเมื่อคุณปรับขนาด
ผู้รับมอบสิทธิ์ไม่จำเป็นสำหรับการเลื่อนดูการทำงาน
ตรวจสอบให้แน่ใจว่าคุณมีคุณสมบัติ contentSize ของชุดมุมมองเลื่อนเป็นขนาดที่ถูกต้อง (เช่นขนาดใหญ่พอที่จะรวมเนื้อหาทั้งหมดของคุณ)
ยกเลิกการเลือก 'Use Autolayout' สำหรับฉัน
สภาพแวดล้อม: xCode 5.0.2 สตอรี่บอร์ด ios7
ในกรณีของฉันฉันต้องตั้งค่าdelaysContentTouchesเป็นจริงเพราะวัตถุใน scrollView ทั้งหมดจับเหตุการณ์สัมผัสและจัดการตัวเองมากกว่าปล่อยให้ scrollView ตัวเองจัดการมัน
ชุด contentSizeคุณสมบัติของUIScrollviewในViewDidLayoutSubviewsวิธี บางสิ่งเช่นนี้
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.contentSize = CGSizeMake(view.frame.size.width, view.frame.size.height)
}
แนวคิดของสาเหตุที่เลื่อนดูไม่ได้เนื่องจากคุณตั้งค่าขนาดเนื้อหาสำหรับการเลื่อนน้อยกว่าขนาดของมุมมองเลื่อนซึ่งไม่ถูกต้อง คุณควรตั้งค่าขนาดเนื้อหาให้ใหญ่กว่าขนาดของมุมมองการเลื่อนเพื่อเลื่อนดูในขณะที่เลื่อน
แนวคิดเดียวกันกับการซูมคุณตั้งค่าขั้นต่ำและค่าสูงสุดสำหรับการซูมซึ่งจะนำไปใช้ผ่านการดำเนินการซูม
ยินดีต้อนรับ :)
นอกจากนี้เล็กน้อยหนึ่งข้อทั้งหมดข้างต้นเป็นสาเหตุที่แท้จริงที่ทำให้มุมมองเลื่อนของคุณอาจไม่เลื่อน แต่บางครั้งก็ไม่สนใจสิ่งนี้อาจเป็นเหตุผลพิเศษเมื่อเพิ่ม scrollview ผ่านรหัสและไม่ใช่ IB คุณอาจเพิ่มการชมย่อยลงในมุมมองพาเรนต์ scrollview สิ่งนี้ทำให้มุมมองย่อยไม่เลื่อน
และเก็บชุดขนาดเนื้อหาและใหญ่กว่าเฟรมมุมมองหลัก (duhh !!)
ฉันทำให้มันใช้งานได้ในการลองครั้งแรกของฉัน ด้วยเลย์เอาต์อัตโนมัติและทุกอย่างไม่มีรหัสเพิ่มเติม จากนั้นดูคอลเลคชั่นไปกล้วยเวลาทำงานล้มเหลวฉันไม่พบสิ่งผิดปกติดังนั้นฉันจึงลบและสร้างใหม่ (ฉันใช้ Xcode 10 Beta 4 มันให้ความรู้สึกเหมือนเป็นแมลง) แล้วการเลื่อนก็หายไป มุมมองคอลเล็กชันทำงานได้อีกครั้ง!
หลายชั่วโมงต่อมา .. นี่คือสิ่งที่แก้ไขสำหรับฉัน ฉันมีเค้าโครงต่อไปนี้:
UIView
มันอยู่ในข้อ จำกัด พื้นที่ปลอดภัยถูกกำหนดโดยระบบโดยอัตโนมัติ ในกรณีที่เลวร้ายที่สุดให้ลบข้อ จำกัด ทั้งหมดสำหรับการเลื่อนและมุมมองเนื้อหาและไม่มีการรีเซ็ต / สร้าง IB สำหรับคุณ ทำให้มันทำงานด้วยตนเอง
โดยทั่วไปแนวคิดคือการมีการเลื่อนดูเนื้อหาที่เหมาะสมเลื่อนซึ่งเป็นพื้นที่ปลอดภัยที่เหมาะสม
แต่มันไม่ทำงาน มุมมองเนื้อหาพลาดความสูง ฉันพยายามทั้งหมดที่ฉันสามารถและเป็นคนเดียวที่ทำเคล็ดลับได้รับเนื้อหามุมมองความสูงสร้างการควบคุมการลากดูเนื้อหา .. กับตัวเอง ที่กำหนดความสูงคงที่ซึ่งได้รับการคำนวณค่าจากขนาดของตัวควบคุมมุมมอง (กำหนดเป็นรูปแบบอิสระนานกว่าจอแสดงผลจริงเพื่อให้มีการสัมภาษณ์ทั้งหมดของฉัน) และในที่สุดมันก็ทำงานได้อีกครั้ง!
หากคุณได้รับข้อความ (IOS8 / swift) ที่viewDidLayoutSubviewsไม่มีอยู่ให้ใช้สิ่งต่อไปนี้แทน
override func viewDidAppear(animated: Bool)
สิ่งนี้แก้ไขได้สำหรับฉัน
บางสิ่งที่ไม่เคยพูดถึงมาก่อน!
ตรวจสอบให้แน่ใจว่าเต้าเสียบของคุณเชื่อมต่ออย่างถูกต้องกับ scrollView! มันควรจะมีวงกลมที่เต็มไปด้วยแม้ว่าแม้ว่าคุณจะได้วงกลมที่เต็มไปด้วย scrollView อาจไม่ได้รับการเชื่อมต่อ - ดังนั้นตรวจสอบอีกครั้ง! โฮเวอร์เหนือวงกลมและดูว่า scrollview จริงได้รับการเน้นหรือไม่! (นี่เป็นกรณีสำหรับฉัน)
//Connect below well to the scrollView in the storyBoard
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
หลายครั้งที่รหัสถูกต้องถ้าคุณได้ทำตามบทช่วยสอน แต่สิ่งที่ผู้เริ่มต้นหลายคนไม่ทราบก็คือ scrollView จะไม่เลื่อนตามปกติผ่านตัวจำลอง มันควรที่จะเลื่อนเมื่อคุณกดลงบน mousepad และเลื่อนพร้อมกัน ผู้ใช้XCode / Swift / Obj-C ที่มีประสบการณ์จำนวนมากนั้นคุ้นเคยกับการทำสิ่งนี้และพวกเขาไม่รู้ว่ามันจะถูกมองข้ามโดยผู้เริ่มต้น Ciao :-)
@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(scrollView)
// Do any additional setup after the view
}
override func viewWillLayoutSubviews(){
super.viewWillLayoutSubviews()
scrollView.contentSize = CGSize(width: 375, height: 800)
}
รหัสนี้จะทำงานได้อย่างสมบูรณ์แบบตราบใดที่คุณทำในสิ่งที่ฉันพูดไว้ข้างต้น
หากไม่มีวิธีการอื่นใดที่เหมาะกับคุณให้ตรวจสอบอีกครั้งว่ามุมมองการเลื่อนของคุณเป็นUIScrollViewอินเทอร์เฟซผู้สร้าง
เมื่อถึงจุดหนึ่งในช่วงไม่กี่วันที่ผ่านมาฉันUIScrollView เปลี่ยนชนิดตามธรรมชาติเป็น a UIViewแม้ว่าคลาสของมันจะพูดUIScrollViewในสารวัตร ฉันกำลังใช้Xcode 5.1 (5B130a)ฉันใช้
คุณสามารถสร้างมุมมองเลื่อนใหม่และคัดลอกการวัดการตั้งค่าและข้อ จำกัด จากมุมมองเก่าหรือคุณสามารถเปลี่ยนมุมมองของคุณเป็น a UIScrollViewในxibไฟล์ได้ด้วยตนเอง ฉันทำการเปรียบเทียบและพบความแตกต่างดังต่อไปนี้:
เดิม:
<scrollView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" directionalLockEnabled="YES" bounces="NO" pagingEnabled="YES" showsHorizontalScrollIndicator="NO" showsVerticalScrollIndicator="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Wsk-WB-LMH">
...
</scrollView>
หลังจากเปลี่ยนประเภทตามธรรมชาติแล้ว:
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" customClass="UIScrollView" id="qRn-TP-cXd">
...
</view>
ดังนั้นฉันจึงแทนที่<view>บรรทัดด้วยต้นฉบับของฉัน<scrollView>บรรทัด
ฉันยังเปลี่ยนแท็กใกล้มุมมองที่มี</view></scrollView>
ตรวจสอบให้แน่ใจว่าเก็บ id เหมือนกับมุมมองปัจจุบันในกรณีนี้: id = "qRn-TP-cXd"
ฉันต้องล้าง xib ออกจากแคชของ Xcode ด้วยการลบข้อมูลที่ได้จากแอป:
Xcode->Window->Organizer->Projectsเลือกโครงการของคุณบนเส้นข้อมูลที่ได้รับคลิกลบ ...หรือหากใช้อุปกรณ์:
Xcode->Window->Organizer->Deviceเลือกอุปกรณ์ของคุณ -> แอปพลิเคชันเลือกแอปของคุณคลิก (-)ตอนนี้ทำความสะอาดโครงการและลบแอพออกจากโปรแกรมจำลอง / อุปกรณ์:
Xcode->Product->CleanSimulator/device->pressและกดapp->clickปุ่ม (X) เพื่อลบออกจากนั้นคุณควรจะสามารถสร้างและเรียกใช้แอปของคุณและมีฟังก์ชันการเลื่อนอีกครั้ง
ป.ล. ฉันไม่ต้องตั้งค่าขนาดเนื้อหาของหน้าจอเลื่อนviewDidLayoutSubviewsหรือปิดเลย์เอาต์อัตโนมัติ แต่เป็น YMMV
หากคุณscrollViewเป็น subview ของcontainerViewบางชนิดแล้วให้แน่ใจว่าคุณอยู่ในกรอบหรือขอบเขตของscrollView containerViewฉันมีcontainerView.clipsToBounds = NOสิ่งใดที่ยังอนุญาตให้ฉันเห็น scrollView แต่เนื่องจากscrollViewไม่ได้อยู่ในขอบเขตของcontainerViewมันจะไม่ตรวจจับเหตุการณ์การสัมผัส
ตัวอย่างเช่น:
containerView.frame = CGRectMake(0, 0, 200, 200);
scrollView.frame = CGRectMake(0, 200, 200, 200);
[containerView addSubview:scrollView];
scrollView.userInteractionEnabled = YES;
คุณจะสามารถดู scrollView แต่จะไม่ได้รับการโต้ตอบจากผู้ใช้
เพิ่มรหัสต่อไปนี้ในการviewDidLayoutSubviewsทำงานสำหรับฉันด้วย Autolayout หลังจากลองคำตอบทั้งหมด:
- (void)viewDidLayoutSubviews
{
self.activationScrollView.contentSize = CGSizeMake(IPHONE_SCREEN_WIDTH, 620);
}
//set the height of content size as required
เพิ่มUIScrollViewDelegateและเพิ่มรหัสต่อไปนี้ไปยังviewDidAppearวิธีการแก้ไขให้ฉัน
@interface testScrollViewController () <UIScrollViewDelegate>
-(void)viewDidAppear:(BOOL)animated {
self.scrollView.delegate = self;
self.scrollView.scrollEnabled = YES;
self.scrollView.contentSize = CGSizeMake(375, 800);
}
ปัญหาของฉันได้รับการแก้ไขโดย:
เมื่อฉันลบข้อ จำกัด ด้านบนและ / หรือด้านล่างที่ผูกไว้กับพื้นที่ปลอดภัยและ / หรือการกำกับดูแลมุมมองภายใน scrollView สามารถเลื่อนอีกครั้งและไม่คงที่ไปที่ด้านบนของหน้าจอ!
หวังว่าสิ่งนี้จะหยุดคนอื่นจากอาการปวดชั่วโมงกับปัญหานี้
อีกกรณีที่สนุก:
scrollview.superview.userInteractionEnabled ต้องเป็นจริง
ฉันเสียเวลา 2 + ชั่วโมงในการไล่ล่านี่แค่คิดออกว่า parent คือ UIImageView ซึ่งโดยธรรมชาติแล้ว userInteractionEnabled == false
หลังจากล้มเหลวด้วยคำตอบที่ให้ไว้ในหัวข้อนี้ฉันสะดุดกับบทความนี้ด้วยการแก้ปัญหา
มีสองสิ่งที่ไม่เข้าใจง่ายเกี่ยวกับการตั้งค่า scrollview ด้วยการชำระอัตโนมัติ:
นี่คือส่วนสำคัญของบทความนั้น สำหรับคำอธิบายที่สมบูรณ์รวมถึงภาพประกอบลองดู
ฉันพบว่าปัญหา AutoLayout นี้ ... หากฉันViewControllerใช้UIViewแทนUIScrollViewชั้นเรียน ... จากนั้นเพิ่มUIScrollViewตัวเอง ... มันใช้งานได้
ฉันมีปัญหาเดียวกันใน IB
หลังจากตั้งค่าการนำหน้า, ต่อท้าย, ด้านบนและด้านล่างของ scrollView เป็น superView ฉันทำการเปลี่ยนแปลงต่อไปนี้เพื่อให้ containerView เลื่อนได้ซึ่งทำงานได้
ในการทำให้ scrollView เลื่อนบนทิศทางแนวนอนเท่านั้นให้ จำกัด ด้วย scrollview's centerY = ContainerView's centerY
และเพื่อให้สามารถเลื่อนในแนวตั้งได้ให้ centerView ของ scrollView = ContainerView ของ centerX