ฉันUIScrollView
มีหลายอันที่มีUIImageView
s, UILabels ฯลฯ ... ป้ายกำกับนั้นยาวกว่านั้นUIScrollView
มาก แต่เมื่อฉันเรียกใช้แอพฉันไม่สามารถคลิกและเลื่อนลง ...
เหตุใดจึงเป็นเช่นนี้
ขอบคุณ
ฉันUIScrollView
มีหลายอันที่มีUIImageView
s, 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->Clean
Simulator/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